#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
char tmp[1000005];
struct AC{
int tr[500005][26],fail[500005],e[500005],cnt,root;//数组大小
int newnode()
{
for(int i=0;i<26;i++)tr[cnt][i]=-1;
e[cnt]=0;
cnt++;
return cnt-1;
}
void init()
{
cnt=0;
root=newnode();
}
void insert(char s[])
{
int u=0;
for(int i=0;s[i];i++)
{
int n=s[i]-'a';//
if(tr[u][n]==-1)tr[u][n]=newnode();
u=tr[u][n];
}
e[u]++;
}
void getfail()
{
queue<int> q;
for(int i=0;i<26;i++)
{
if(tr[0][i]!=-1)
{
fail[tr[0][i]]=root;
q.push(tr[0][i]);
}
else tr[0][i]=root;
}
while(!q.empty())
{
int u=q.front();
q.pop();
for(int i=0;i<26;i++)
{
if(tr[u][i]!=-1)fail[tr[u][i]]=tr[fail[u]][i],q.push(tr[u][i]);
else tr[u][i]=tr[fail[u]][i];
}
}
}
int query(char t[])
{
int u=0,sum=0;
for(int i=0;t[i];i++)
{
int n=t[i]-'a';
u=tr[u][n];
for(int j=u;j && ~e[j];j=fail[j])sum+=e[j],e[j]=-1;
}
return sum;
}
}ac;
int main()
{
int T;
scanf("%d",&T);
for(int i=1;i<=T;i++)
{
ac.init();
int n;
scanf("%d",&n);
for(int j=1;j<=n;j++)
{
scanf("%s",tmp);
ac.insert(tmp);
}
ac.getfail();
scanf("%s",tmp);
printf("%d\n",ac.query(tmp));
}
return 0;
}
HDU 2222 Keywords Search(AC自动机)
最新推荐文章于 2024-10-04 23:00:36 发布