(悬关)萌新刚学ac自动机,求大佬帮忙看一下
查看原帖
(悬关)萌新刚学ac自动机,求大佬帮忙看一下
1046135
huangshuchang楼主2024/7/22 15:17
#include<bits/stdc++.h>
using namespace std;
char str[100000010],t[100000010],tmp[12345608];
int trie[10001][10001],fail[10001000],lent,n,tot;
int End[10001011],vis[100109];
queue<int> q;
void ins(char *str){
	int len=strlen(str),p=0;
	for(int i=0;i<len;i++){
		int ch=str[i]-'A';
		if(!trie[p][ch]) trie[p][ch]=++tot;
		p=trie[p][ch];
	}
	End[p]++;
}
void build(){
	for(int i=0;i<26;i++) if(trie[0][i]) q.push(trie[0][i]),fail[trie[0][i]]=0;
	while(!q.empty()){
		int u=q.front();q.pop();
		for(int i=0;i<26;i++){
			if(trie[u][i]) fail[trie[u][i]]=trie[fail[u]][i],q. push(trie[u][i]);
			else trie[u][i]=trie[fail[u]][i];
		}
	}
	int p=0;
	for(int i=0;i<lent;i++){
		p=trie[p][t[i]-'A'];
		for(int k=p;k&&!vis[k];k=fail[k]) vis[k]=1;
	}
}
int Query(char *str){
	int len=strlen(str),p=0,res=0;
	for(int i=0;i<len;i++){
		p=trie[p][str[i]-'A'];
		if(vis[p]) res=i+1;
	}
	return res;
}
int main(){
	scanf("%d%d",&lent,&n);
	scanf("%s",t);
	for(int i=1;i<=n;i++){
		scanf("%s",tmp[i]);
		ins(tmp[i]);
	}
	build();
	for(int i=1;i<=n;i++){
		printf("%d\n",Query(tmp[i]));
	}
	return 0;
}

本人自学,勿骂

2024/7/22 15:17
加载中...