• poj1409


    dfs+排序

    View Code
    //zoj1684
    //注意字典序排序,是按照逐个单词比较出来的,每个句子的第x个单词只和其他句子的第x个单词进行比较。先比第一个单词再比第二个单词
    //例如: 句子"i am"的字典序就在句子"ia m"的前面
    //还有根据g++编译器,string是不能进行memset的,否则会出错。
    #include <iostream>
    #include <string>
    using namespace std;
    
    const    int        maxn = 105, maxl = 105, maxa = 105;
    
    struct words
    {
        string    sequence;
        string    word;
    };
    
    struct answers
    {
        int        numbers[301];
    };
    
    int        n, len, total;
    string    input;
    answers    ans[maxa];
    words    dictionary[maxn];
    
    void makesequence(words &x)
    {
        int        i, l = x.word.length(), temp;
        
        x.sequence = "";
        for (i = 0; i < l; i++)
        {
            temp = (x.word[i] - 'a') / 3 + 2;
            switch (x.word[i])
            {
                case    's'    :temp = 7; break;
                case    'v'    :temp = 8; break;
                case    'z'    :
                case    'y'    :temp = 9; break;
            }
            x.sequence += temp + '0';
        }
    }
    
    void init()
    {
        int        i;
        
        total = 0;
        memset(ans, 0, sizeof(ans));
        getchar();
        for (i = 1; i <= n; i++)
        {
            getline(cin, dictionary[i].word);
            makesequence(dictionary[i]);
        }
        getline(cin, input);
        len = input.length();
    }
    
    void work(int start)
    {
        int        i,l;
    
        if (start == len)
        {
            total++;
            for (i = 0; i <= ans[total - 1].numbers[0]; i++)
                ans[total].numbers[i] = ans[total - 1].numbers[i];
            return;
        }
        for (i = 1; i <= n; i++)
        {
            l = dictionary[i].word.length();
            if (l > len - start)
                continue;
            if (input.substr(start, l) == dictionary[i].sequence)
            {
                ans[total].numbers[0]++;
                ans[total].numbers[ans[total].numbers[0]] = i;
                work(start + l);
                ans[total].numbers[0]--;
            }
        }
    }
    
    bool bigger(answers a, answers b)
    {
        int     l,i;
        
        l = a.numbers[0];
        if (l > b.numbers[0])
            l = b.numbers[0];
        for (i = 1; i <= l; i++)
        {
            if (dictionary[a.numbers[i]].word > dictionary[b.numbers[i]].word)
                return true;
            if (dictionary[a.numbers[i]].word < dictionary[b.numbers[i]].word)
                return false;
        }
        if (a.numbers[0] < b.numbers[0])
            return true;
        return false;
    }
    
    void sort()
    {
        int        i,j;
        answers    t;
    
        for (i = 0; i < total - 1; i++)
            for (j = i + 1; j < total; j++)
                if (bigger(ans[i], ans[j]))
                {
                    t = ans[i];
                    ans[i] = ans[j];
                    ans[j] = t;
                }
    }
    
    void print()
    {
        int        i,j;
    
        for (i = 0; i < total; i++)
        {
            cout << dictionary[ans[i].numbers[1]].word;
            for (j = 2; j <= ans[i].numbers[0]; j++)
                cout << " " << dictionary[ans[i].numbers[j]].word;
            cout << ".\n";
        }
        cout << "--\n";
    }
    
    int main()
    {
    //    freopen("t.txt", "r", stdin);
    //    freopen("y.txt", "w", stdout);
        cin >> n;
        while (n != 0)
        {
            init();
            work(0);
            sort();
            print();
            cin >> n;
        }
        return 0;
    }
  • 相关阅读:
    float对内联元素和块元素的影响
    行内元素的困扰
    Nodejs同步和异步编程
    let、const、var的区别
    作用域
    SpringMVC
    MVC2新闻编译与发布
    JSP显示新闻
    servlet应用
    SWPU邮件登录界面的仿写(第二次作业)
  • 原文地址:https://www.cnblogs.com/rainydays/p/2982612.html
Copyright © 2020-2023  润新知