ac自动机板子

hdu2222

#include<bits/stdc++.h>
#define ll long long 
#define M 500005
using namespace std;
int tr[M][30],T,n,i,fail[M],cnt[M],sz;
char s[1000005];

void add(char *s){
	int len=strlen(s),u=0;
	for(int i=0;i<len;i++){
		if(!tr[u][s[i]-'a'])tr[u][s[i]-'a']=++sz;
		u=tr[u][s[i]-'a'];
	}
	cnt[u]++;
}
void getfail(){
	fail[0]=0;
	queue<int>Q;
	for(int i=0;i<26;i++){
		int u=tr[0][i];
		if(u){
			fail[u]=0;Q.push(u);
		}
	}
	while(!Q.empty()){
		int u=Q.front();Q.pop();
		for(int i=0;i<26;i++){
			int v=tr[u][i];
			if(v){
				fail[v]=tr[fail[u]][i];
				Q.push(v);
			}else
				tr[u][i]=tr[fail[u]][i];
		}
	}
}
ll Find(char *s){
	int len=strlen(s),u=0;
	ll ans=0;
	for(int i=0;i<len;i++){
		u=tr[u][s[i]-'a'];
		for(int j=u;j&&cnt[j]!=-1;j=fail[j]){
			ans+=cnt[j];
			cnt[j]=-1;
		}
	}
	return ans;
}
int main(){
	cin>>T;
	while(T--){
		memset(tr,0,sizeof(tr));
		memset(cnt,0,sizeof(cnt));
		sz=0;

		scanf("%d",&n);
		for(i=0;i<n;i++){
			scanf("%s",s);add(s);
		}
		getfail();
		scanf("%s",s);
		printf("%lld
",Find(s));
	}
}
原文地址:https://www.cnblogs.com/VIrtu0s0/p/10548624.html