AC自动机#2WA求调
查看原帖
AC自动机#2WA求调
752094
MornHus楼主2023/3/9 13:41
#include<bits/stdc++.h>
using namespace std;
struct ac_auto{
	int vis[26];
	int fail;
	int tot;
}AC[1000001];
int cnt;
int n;
char mode[1000001];
char t[1000001];
int su(char a){
	return a-'0';
}
void insert(char str[]){
	int now=0,sus;
	int leng=strlen(str);
	for(int i=0;i<leng;i++){
		sus=su(str[i]);
		if(!AC[now].vis[sus]){
			AC[now].vis[sus]=++cnt;
		}
		now=AC[now].vis[sus];
	}
	AC[now].tot++;
}
void Build_fail(){
	queue<int>q;
	for(int i=0;i<26;i++){
		if(AC[0].vis[i]){
			AC[AC[0].vis[i]].fail=0;
			q.push(AC[0].vis[i]);
		}
	}
	while(!q.empty()){
		int now=q.front();
		q.pop();
		for(int i=0;i<26;i++){
			if(AC[now].vis[i]){
				AC[AC[now].vis[i]].fail=AC[AC[now].fail].vis[i];
				q.push(AC[now].vis[i]);
			}else{
				AC[now].vis[i]=AC[AC[now].fail].vis[i];
			}
		}
	}
}
int AC_query(){
	int leng=strlen(t);
	int now=0;
	int ans=0;
	for(int i=0;i<leng;i++){
		now=AC[now].vis[su(t[i])];
		for(int j=now;j&&AC[j].tot!=-1;j=AC[j].fail){
			ans+=AC[j].tot;
			AC[j].tot=-1;
		}
	}
	return ans;
}
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%s",mode);
		insert(mode);
	}
	AC[0].fail=0;
	Build_fail();
	scanf("%s",t);
	printf("%d",AC_query());
	return 0;
} 
2023/3/9 13:41
加载中...