AC自动机?WA了。。

AC自动机

image

image

image

image

image

代码

#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;
}

image

posted @ 2025-07-28 08:04  BIxuan—玉寻  阅读(16)  评论(0)    收藏  举报