0
点赞
收藏
分享

微信扫一扫

AC自动机模板

晚熟的猫 2022-01-20 阅读 42

存个板子,内容以后补

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+50;
struct mint
{
	int son[26],flag,fail;	
}trie[maxn];
int n,cnt;
char s[maxn];
queue<int> q;
void insert(char* s)
{
	int u=1,len=strlen(s);
	for(int i=0;i<len;++i)
	{
		int v=s[i]-'a';
		if(!trie[u].son[v]) trie[u].son[v]=++cnt;
		u=trie[u].son[v];
	}
	trie[u].flag++;
}

void getFail()
{
	for(int i=0;i<26;++i) trie[0].son[i]=1;
	q.push(1);trie[1].fail=0;
	while(!q.empty())
	{
		int u=q.front();
		q.pop();
		for(int i=0;i<26;++i)
		{
			int v=trie[u].son[i];
			int Fail=trie[u].fail;
			if(!v){trie[u].son[i]=trie[Fail].son[i];continue;}
			trie[v].fail=trie[Fail].son[i];
			q.push(v);
		}
	}
}

int query(char* s)
{
	int u=1,ans=0,len=strlen(s);
	for(int i=0;i<len;++i)
	{
		int v=s[i]-'a';
		int k=trie[u].son[v];
		while(k>1 && trie[k].flag!=-1)
		{
			ans+=trie[k].flag;
			trie[k].flag=-1;
			k=trie[k].fail;
		}
		u=trie[u].son[v];
	}
	return ans;
}

int main()
{
	cnt=1;
	scanf("%d",&n);
	for(int i=1;i<=n;++i)
	{
		scanf("%s",s);
		insert(s);	
	}
	getFail();
	scanf("%s",s);
	printf("%d\n",query(s));
	return 0;	
}
举报

相关推荐

0 条评论