[字典树入门] HDOJ 1251 统计难题

不需要保存是否结束(isend),在插入时每经过一个节点,将该节点的计数器 +1,在查找时输出最后一个字符所在节点的cnt值即可;
PS:为什么加了删除树(del_Trie)会超时呢?

# include <cstdio>

# include <cstring>



# define LEN 10 + 1



struct node

{

    int cnt;

    node * next[26];

    node ()

    {

        cnt = 0;

        memset(next, 0, sizeof(next));

    }

};



void insert_Trie(node *root, char *s)

{

    int c;

    node *p = root;

    for (int i = 0; s[i]; ++i)

    {

        c = s[i]-'a';

        if (p->next[c] == NULL) p->next[c] = new node;

        p = p->next[c];

        ++(p->cnt);

    }

}



void build_Trie(node *root)

{

    char s[LEN];

    while (gets(s) , strcmp(s, ""))

    {

        insert_Trie(root, s);

    }

}



void del_Trie(node *p)

{

    for (int i = 0; i < 26; ++i)

        if (p->next[i]) del_Trie(p->next[i]);

    del_Trie(p);

}



int search(node *root, char *s)

{

    int c;

    node *p = root;

    for (; *s; ++s)

    {

        c = *s-'a';

        if (p->next[c]) p = p->next[c];

        else return 0;

        if ((*(s+1)) == 0) return p->cnt;

    }

    return 0;

}



void solve(void)

{

    char s[LEN];

    node *root = new node;

    build_Trie(root);

    while (gets(s) != NULL)

    {

        int ans = search(root, s);

        printf("%d\n", ans);

    }

    //del_Trie(root);     //TLE 

}



int main()

{

    solve();



    return 0;

}

你可能感兴趣的:(字典树)