DHU--1247 Hat’s Words && HiHocder--1014 Trie树 (字典树模版题)
题目链接
两个一个递归方式一个非递归
HiHocoder
#include<bits/stdc++.h> using namespace std; #define maxn 100010 struct ac{ int sum,nex[26],fa; }tre[maxn*4]; int tot=0,len=0; string s; void updata(int x,int y){ if(x>=s.size()) return ; int k=s[x]-'a'; int i; if(tre[y].nex[k]){ i=tre[y].nex[k]; tre[i].sum++; updata(++x,i); }else{ tre[y].nex[k]=++tot; tre[tot].sum=1; i=tot; updata(++x,i); } if(x==s.size()-1){ tre[i].fa++; } } int query(int x,int y){ int k=s[x]-'a'; if(x==s.size()-1){ int i=tre[y].nex[k]; return tre[i].sum; } if(tre[y].nex[k]){ return query(++x,tre[y].nex[k]); } return 0; } int main(){ memset(tre,0,sizeof(tre)); int n,m; cin>>n; for(int j=0;j<n;j++){ cin>>s; updata(0,0); } cin>>m; for(int j=0;j<m;j++){ cin>>s; printf("%d\n",query(0,0)); } } /* 5 babaab babbbaaaa abba aaaaabaa babaababb 5 babb baabaaa bab bb bbabbaab 求前缀 1 0 3 0 0 */
HDU
#include<bits/stdc++.h> using namespace std; #define maxn 100000 char a[50005][30]; int len=0,tot=0; struct ac{ int sum,nex[26],fa,c; void init(){ sum=0;fa=0; memset(nex,0,sizeof(nex)); } }tre[maxn*4]; void add(char s[]){ int i=0,j; int z=0; while(s[i]){ int k=s[i]-'a'; if(tre[z].nex[k]){ j=tre[z].nex[k]; tre[j].sum++; z=j; }else{ tre[z].nex[k]=++tot; j=tot; tre[j].init(); tre[j].sum=1; z=j; } i++; } tre[z].fa++; } bool query(char s[]){ int i=0,j,z=0; while(s[i]){ int k=s[i]-'a'; if(tre[z].nex[k]==0) return 0; z=tre[z].nex[k]; i++; } if(tre[z].fa) return 1; return 0; } bool query1(char s[]){ int i=0,j,z=0; while(s[i]){ int k=s[i]-'a'; z=tre[z].nex[k]; if(tre[z].fa){ if(query(s+i+1)) return 1; } i++; } return 0; } int main(){ while(scanf("%s",a[len++])!=EOF) add(a[len-1]); for(int j=0;j<len;j++){ if(query1(a[j])){ cout<<a[j]<<endl; } } }