rt,下方代码可A此题
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<queue>
using namespace std;
char name[1000003],f[1000003];
int cont,n,m;
struct nd {
int cnt,nt[30],fail;
bool end;
} t[800006];
void insert() {
scanf("%s",name+1);
int v,l=strlen(name+1),now=0;
//printf("%dl",l);
for(int i=1; i<=l; ++i) {
v=name[i]-'a';
if(!t[now].nt[v])t[now].nt[v]=++cont;
//printf("znow%d v%d %d n \n",now,v,t[now].nt[v]);
now=t[now].nt[v];
}
//printf("%d nowzzz\n",now);
t[now].end=1;
++t[now].cnt;
}
void fa() {
queue<int>q;
//q.push(0);
for(int i=0; i<26; ++i) {
if(t[0].nt[i])t[t[0].nt[i]].fail=0,q.push(t[0].nt[i]);
}
int now,next;
while(!q.empty()) {
now=q.front();
q.pop();
for(int i=0; i<26; ++i) {
next=t[now].nt[i];
if(next){
t[next].fail=t[t[now].fail].nt[i];
q.push(next);
}
else {
t[now].nt[i]=t[t[now].fail].nt[i];
//printf("del n%d v%d n%d\n",next,i,t[next].nt[i]);
}
}
}
}
int AChicken(){
scanf("%s",f+1);
int len=strlen(f+1),now=0,v,ans=0;
for(int i=1;i<=len;++i){
v=f[i]-'a';
//printf("now%d v%d %c %d f%d\n",now,v,f[i],t[now].nt[v],t[now].fail);
now=t[now].nt[v];
if(t[now].cnt){
ans+=t[now].cnt;
t[now].cnt=0;
}
}
return ans;
}
int main() {
int ls;
scanf("%d",&n);
for(int i=1; i<=n; ++i)insert();
fa();
printf("%d",AChicken());
return 0;
}
但以下数据会错误。
输入
3
abc
bc
c
abc
应当输出
3
实际输出
1