1251 字典树 模板

来源:互联网 发布:win10 kaiwifi软件 编辑:程序博客网 时间:2024/04/29 11:21

参考资料 :

http://www.wutianqi.com/?p=1359

http://blog.csdn.net/xingyeyongheng/article/category/1516007

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;struct Trie{    int num;    Trie *next[26];//指针数组}root;void createTrie(char *str)//建树{    int len = strlen(str);    Trie *p = &root, *q;    for(int i = 0; i < len; i++)    {        int id = str[i] - 'a';        if(p->next[id] == NULL)//对应的位置为空        {            q = (Trie *)malloc(sizeof(root));            q->num = 1;            for(int j = 0; j < 26; j++) q->next[j] = NULL;            p->next[id] = q;            p = p->next[id];        }        else        {            p->next[id]->num++;            p = p->next[id];        }    }}int findTrie(char *str){    int len = strlen(str);    Trie *p = &root;    for(int i = 0; i < len; i++)    {        int id = str[i] - 'a';        p = p->next[id];        if(p == NULL) return 0;    }    return p->num;}int main(){    char str[15];    for(int i = 0; i < 26; i++) root.next[i] = NULL;//初始化,root 不是指针    while(gets(str) && str[0] != '\0') createTrie(str);    memset(str, 0, sizeof(str));    while(scanf("%s", str) != EOF)    {        int ans = findTrie(str);        printf("%d\n", ans);    }    return 0;}