hdu2072 单词数(字典树)

这题因为输入WA了N次,全是泪。


注意字符串前面有空格的情况,输入方法还是看的别人的。

最重要的一点,这题只是通过统计某单词是否出现来统计不同单词字数,切记要把p -> sum ++;放在外面,放在里面就不行。理论上来说也可以啊,最底层的字母sum都是0,可是就是WA,实在没辙,放for外面好了。


#include 
#include 
#include 
#include 
#include 

using namespace std;

typedef long long LL;

const int N = 1000005;
const int INF = 1e8;

struct Trie
{
    int sum;
    Trie *next[26];
    Trie()
    {
        sum = 0;
        for(int i = 0; i < 26; i ++)
            next[i] = 0;
    }
}*root;

int ans;

void inserttrie(Trie *p, char *str)
{
    int k = 0;
    while(str[k] != '\0')
    {
        int id = str[k] - 'a';
        if(p -> next[id] == 0)
        {
            p -> next[id] = new Trie;
        }
        p = p -> next[id];
        k ++;
    }
    if(p -> sum == 0) ans ++;
    p -> sum ++;//该单词是否出现过,注意放在外面
}

void Free(Trie *p)
{
    for(int i = 0; i < 26; i ++)
        if(p -> next[i]) Free(p -> next[i]);
    if(p) delete p;
}

int main()
{
   // freopen("in.txt", "r", stdin);
    char s[N], s0[1005];
    while(gets(s))
    {
        ans = 0;
        root = new Trie;
        if(s[0] == '#') break;
        int len = strlen(s);
        int j = 0;
        for(int i = 0; i < len; i ++)
        {
            while(s[i ++] == ' '); i --;
            if(i >= len) break;
            int j = 0;
            while(s[i] != ' ' && i < len)
                s0[j ++] = s[i ++];
            s0[j] = '\0';
            inserttrie(root, s0);
        }
        printf("%d\n", ans);
        Free(root);
    }
    return 0;
}


你可能感兴趣的:(hdu,数据结构-各种树)