本来是真的特别不想写这个的 但是有段时间洛谷天天智推这个可能是我太菜了
然后觉得这个也不难 乘着今早没事写下 来这保存下 方便下次食用
1 #include <bits/stdc++.h> 2 using namespace std; 3 struct Node{int to[26],ed,f;}a[1<<20]; 4 string s; 5 int pre[1<<20]; 6 int n,pos,tot,t,h,tt,g; 7 int main(){ 8 scanf("%d",&n); 9 for (register int i=1;i<=n;++i){ 10 cin>>s;pos=0; 11 for (register int j=0;j<s.size();++j){ 12 tt=s[j]-'a'; 13 if (!a[pos].to[tt]) a[pos].to[tt]=++tot; 14 pos=a[pos].to[tt]; 15 } 16 ++a[pos].ed; 17 } 18 for (register int i=0;i<26;++i) 19 if (a[0].to[i]) 20 pre[++t]=a[0].to[i]; 21 while (h!=t){ 22 g=pre[++h]; 23 for (register int i=0;i<26;++i) 24 if (a[g].to[i]) 25 a[a[g].to[i]].f=a[a[g].f].to[i],pre[++t]=a[g].to[i]; 26 else a[g].to[i]=a[a[g].f].to[i]; 27 } 28 cin>>s; 29 pos=tot=0; 30 for (register int i=0;i<s.size();++i){ 31 pos=a[pos].to[s[i]-'a']; 32 for (register int j=pos;j&&a[pos].ed;j=a[j].f) 33 tot+=a[j].ed,a[j].ed=0; 34 } 35 printf("%d\n",tot); 36 return 0; 37 }