ac自动机

Input
第一行为一个整数n,表示文本的长度
第二行为一个长度为n的文本
第三行为一个整数m,表示模式串个数
下接m行,每行一个模式串
Output
共m行,若第i个模式串在文本中出现过则第i行输出YES,否则输出NO
数据范围
对于30%的数据,n<=10^3,m<=10^3;
对于80%的数据,n<=10^5,m<=10^4;
对于100%的数据,n<=10^5,m<=10^5。
输入文件大小不超过1M。
Sample Input
25
saintzeuscynthiathenahere
3
cynthia
hera
athena
Sample Output
YES
NO
YES

 

#pragma GCC optimize(2)
#include 
using namespace std;
const int MAXN=1e6+10;
struct Trie{
	int son[26];
	int cnt;
	int fail;
}AC[MAXN];
int n,m,tot=0,iidd[MAXN];
bool ans[MAXN];
char S[MAXN],T[MAXN];
void add(char *s,int len,int id){
	int now=0;
	for(register int i=0;i q;
	AC[0].fail=0;
	for(register int i=0;i<26;i++){
		if(AC[0].son[i]){
			AC[AC[0].son[i]].fail=0;
			q.push(AC[0].son[i]);	
		}
	}
	while(!q.empty()){
		int u=q.front();
		q.pop();
		for(register int i=0;i<26;i++)
		{
			if(AC[u].son[i])
			   {
				AC[AC[u].son[i]].fail=AC[AC[u].fail].son[i];
				q.push(AC[u].son[i]);	
			   }
			else 
			      AC[u].son[i]=AC[AC[u].fail].son[i];
		}
	}
}
void AC_query(char *s,int len){
	int now=0;
	for(register int i=0;i 
 

  

你可能感兴趣的:(ac自动机)