#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5;
int go[N][27],fail[N],cnt[N],tcnt=0;
char s[N];
void Insert() {
int sz=strlen(s),u=0;
for(int i=0;i<sz;i++) {
int x=s[i]-‘a‘;
if(!go[u][x]) go[u][x]=++tcnt;
u=go[u][x];
}
cnt[u]=1;
}
void get_fail() {
queue<int> Q;
for(int i=0;i<26;i++) if(go[0][i])fail[go[0][i]]=0,Q.push(go[0][i]);
while(!Q.empty()) {
int u=Q.front(); Q.pop();
for(int i=0;i<26;i++) {
if(go[u][i]) fail[go[u][i]]=go[fail[u]][i],Q.push(go[u][i]);
else go[u][i]=go[fail[u]][i];
}
}
}
int Query() {
int sz=strlen(s),u=0,ans=0;
for(int i=0;i<sz;i++) {
u=go[u][s[i]-‘a‘];
for(int j=u;j&&cnt[j]!=-1;j=fail[j]) {
ans+=cnt[j],cnt[j]=-1;
}
}
return ans;
}
int main() {
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++) {
scanf("%s",s);
Insert();
}
get_fail();
scanf("%s",s);
printf("%d",Query());
return 0;
}
原文:https://www.cnblogs.com/bestime/p/15050863.html