字符串匹配--字典树模板

字典树就是将一个个单词按照字母顺序建成树,可以用于单词去重、计算每种单词的出现次数、计算共出现多少种单词

 

 1 #include<stdio.h>

 2 #include<string.h>

 3 const int maxm=5050;    //maxm是所有单词的总长度

 4 

 5 struct trie{  6     int nxt[maxm][26];    //字母结点

 7     int tail[maxm];        //记录某个结点是否为单词结尾,可以用bool型仅记录是否结尾,也可以int型记录其作为结尾的单词编号或记录单词出现过多少次

 8     int size;  9 

10     void init(){        //初始化函数

11         memset(nxt[0],0,sizeof(nxt[0])); 12         memset(tail,0,sizeof(tail)); 13         size=1; 14  } 15 

16     void insert(char s[]){    //添加单词函数

17         int p=0; 18         for(int i=0;s[i];i++){ 19             int &x=nxt[p][s[i]-'a']; 20             if(!x){ 21                 memset(nxt[size],0,sizeof(nxt[size])); 22                 x=size++; 23  } 24             p=x; 25  } 26         tail[p]=1;    //可以通过函数额外传一个单词编号的int型参数,此处即可将tail[p]赋为单词编号记录下来;也可以根据此处tail[p]的初始值是否为0,若为0可以用计数器加值记录共出现多少不同的单词;换成tail[p]++语句也可以用于记录某个单词出现过多少次

27  } 28 

29     bool find(char s[]){    //查询单词函数,也可以返回int型查询该单词出现过多少次

30         int p=0; 31         for(int i=0;s[i];i++){ 32             int &x=nxt[p][s[i]-'a']; 33             if(!x)return 0; 34             p=x; 35  } 36         return tail[p]; 37  } 38 }; 39 

40 int main(){ 41     char word[50]; 42     int i; 43  trie t; 44  t.init(); 45     for(i=1;i<=10;i++){scanf("%s",word);t.insert(word);} 46     printf("\n"); 47     for(i=1;i<=20;i++){scanf("%s",word);printf("%d\n",t.find(word));} 48     return 0; 49 }

 

你可能感兴趣的:(字符串)