#include<iostream>
#include<queue>
using namespace std;
const int N=1e6+5;
string s[N],T;
int n,tot=1,ch[N][30],fail[N],flag[N];
void build_trie()
{
for(int i=1;i<=n;++i)
{
int siz=s[i].size(),u=1;
for(int j=0;j<siz;++j)
{
int x=s[i][j]-'a';
if(!ch[u][x])ch[u][x]=++tot;
u=ch[u][x];
}
++flag[u];
}
}
void get_fail()
{
queue<int> q; q.push(1);
for(int i=0;i<26;++i)ch[0][i]=1;
while(!q.empty())
{
int u=q.front(); q.pop();
for(int i=0;i<26;++i)
{
int v=ch[u][i],Fail=fail[u];
if(!v){ch[u][i]=ch[Fail][i];continue;}
fail[v]=ch[Fail][i]; q.push(v);
}
}
}
int query()
{
int siz=T.size(),u=1,res=0;
for(int i=0;i<siz;++i)
{
int x=T[i]-'a',v=ch[u][x],tmp=v; u=v;
while(tmp>1&&flag[tmp])res+=flag[tmp],flag[tmp]=0,tmp=fail[tmp];
}
return res;
}
int main()
{
ios::sync_with_stdio(0),cin.tie(0);
cin>>n; for(int i=1;i<=n;++i)cin>>s[i];
build_trie(); get_fail(); cin>>T;
cout<<query()<<'\n';
return 0;
}
这份代码跳fail时条件写错了
以下数据都过不了
3
abc
bcd
c
abc
为什么能过整个数据,两个数据会不会太少了