【模板】 字典树

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 using namespace std;
 5 struct node{
 6     int cnt;  //记录出现次数
 7     int nex[30];//该节点下一个儿子的节点
 8 }trie[400500];
 9 char s1[105],s2[105];
10 int tot=1;//也可以0
11 void build(char* s){
12     int len=strlen(s);
13     int root=0;
14     for(int i=0;i<len;++i){
15         int id=s[i]-'a';
16         if(trie[root].nex[id]==0) trie[root].nex[id]=++tot;
17         root=trie[root].nex[id];
18         ++trie[root].cnt;
19     }
20 }
21 int query(char* s){
22     int len=strlen(s);
23     int root=0;
24     for(int i=0;i<len;++i){
25         int id=s[i]-'a';
26         if(!trie[root].nex[id]) return 0;
27         root=trie[root].nex[id];
28     }
29     return trie[root].cnt;
30 }
31 int main(){
32     while(gets(s1)){
33         int len=strlen(s1);
34         if(!len) break;
35         build(s1);
36     }
37     while(gets(s2)){
38         int u=query(s2);
39         printf("%d\n",u);
40     }
41     return 0;
42 }
43 //hdu1251
44 //https://vjudge.net/contest/281068#problem/C
45 //用gets不用scanf是因为读取字符串时,gets会舍弃回车,但scanf不会。
46 //https://www.cnblogs.com/hlongch/p/5742477.html

猜你喜欢

转载自www.cnblogs.com/xiaobuxie/p/11391852.html