AC自动机?WA了。。
AC自动机





代码
#include<bits/stdc++.h>
using namespace std;
int fail[1000010],t[1000010][30],tot,cnt[1000010];
void add(string s)
{
int root=0;
for(int i=0;i<s.size();i++)
{
int nx=s[i]-'a';
if(t[root][nx]==0)
{
tot++;
t[root][nx]=tot;
}
root=t[root][nx];
}
cnt[root]++;
}
void getfail()//build
{
queue<int>q;
for(int i=0;i<26;i++)
{
if(t[0][i]!=0)
{
fail[t[0][i]]=0;
q.push(t[0][i]);
}
}
while(q.empty()==0)
{
int x=q.front();
q.pop();
for(int i=0;i<26;i++)
{
if(t[x][i]!=0)
{
fail[t[x][i]]=t[fail[x]][i];
q.push(t[x][i]);
}
else
{
t[x][i]=t[fail[x]][i];
}
}
}
}
int find(string s)
{
int x=0,ans=0;
for(int i=0;i<s.size();i++)
{
x=t[x][s[i]-'a'];
for(int j=x;j&&cnt[j]!=-1;j=fail[j])
{
ans+=cnt[j];
cnt[j]=-1;
}
}
return ans;
}
int main()
{
int T;
cin>>T;
while(T--)
{
memset(fail,0,sizeof(fail));
memset(t,0,sizeof(t));
memset(cnt,0,sizeof(cnt));
tot=0;
int n;
cin>>n;
string s;
for(int i=1;i<=n;i++)
{
cin>>s;
add(s);
}
fail[0]=0;
getfail();
cin>>s;
cout<<find(s)<<endl;
}
return 0;
}

以下是签名
${\scr {jade }}$ ${\scr {seek }}$
本文来自博客园,作者:BIxuan—玉寻,转载请注明原文链接:https://www.cnblogs.com/zhangyuxun100219/p/19008228

浙公网安备 33010602011771号