Trie树

简单的字符串算法。出一个纯原创板子吧。

不要忘记字典树和哈希的联系。

HDU1251,计算相同前缀的数目。

 1 #include<bits/stdc++.h>
 2 #define scan(i) scanf("%d",&i)
 3 #define pf printf
 4 #define ll long long
 5 #define f(i,a,b) for(int i=a;i<=b;i++)
 6 using namespace std;
 7 struct node{
 8     int num;
 9     int child[26];
10 }no[260005];
11 int tot=0;
12 char tel[1005];
13 void insert(char in[]){
14     int len=strlen(in+1);
15     int init=0;
16     f(i,1,len){
17         int tem=in[i]-'a';
18         if(no[init].child[tem]==0){
19             tot++;
20             no[init].child[tem]=tot;
21             init=tot;
22         }
23         else init=no[init].child[tem];
24         no[init].num++;
25     }
26 }
27 int query(char in[]){
28     int len=strlen(in+1);
29     int init=0;
30     f(i,1,len){
31         int tem=in[i]-'a';
32         if(no[init].child[tem]==0) return 0;
33         else init=no[init].child[tem];
34     }
35     return no[init].num;
36 }
37 int main(){
38     bool f=true;
39     while(cin.getline(tel+1,1005)){
40         if(strcmp(tel+1,"")==0){
41             f=false;
42             continue;
43         }
44         if(f==true){
45             insert(tel);
46         }
47         else{
48             pf("%d\n",query(tel));
49         }
50     }
51 } 

HDU1671,判断是否存在两个字符串,其中一个字符串是另一个字符串的前缀。

 1 #include<bits/stdc++.h>
 2 #define scan(i) scanf("%d",&i)
 3 #define pf printf
 4 #define ll long long
 5 #define f(i,a,b) for(int i=a;i<=b;i++)
 6 using namespace std;
 7 int t,n;
 8 struct node{
 9     int num;
10     int child[10];
11 }no[100005];
12 int tot=0;
13 char tel[15];
14 bool insert(char in[]){
15     int len=strlen(in+1);
16     int init=0;
17     f(i,1,len){
18         if(no[init].num==-2) return false;
19         int tem=in[i]-'0';
20         if(no[init].child[tem]==0){
21             tot++;
22             no[init].child[tem]=tot;
23             init=tot;
24             if(i-len) no[init].num=-1;
25             else no[init].num=-2;
26         }
27         else init=no[init].child[tem];
28     }
29     if(no[init].num==-1) return false;
30     return true;
31 }
32 int main(){
33     scan(t);
34     f(kk,1,t){
35         scan(n);
36         bool f=true;
37         f(i,1,n){
38             scanf("%s",tel+1);
39             if(f==true){
40                 if(insert(tel)==false){
41                     f=false;
42                 }
43             }
44         }
45         if(f==true) puts("YES");
46         else puts("NO");
47         memset(no,0,sizeof(no));
48         tot=0;
49     }
50 } 

 

posted @ 2020-02-05 14:32  Lovaer  阅读(120)  评论(0编辑  收藏  举报