记录编号 284137 评测结果 AAAAAAA
题目名称 AC自动机 最终得分 100
用户昵称 Gravatar神利·代目 是否通过 通过
代码语言 C++ 运行时间 0.155 s
提交时间 2016-07-17 06:35:03 内存使用 96.24 MiB
显示代码纯文本
#include<stdio.h>
int n,id[110],cnt,son[5010][26];
char s[110][55];
char ch[100000010];
void build(){
	for(int i=0,j,now;i<n;++i){
		scanf("%s",s[i]);
		for(j=now=0;s[i][j];++j){
			if(!son[now][s[i][j]-97])son[now][s[i][j]-97]=++cnt;
			now=son[now][s[i][j]-97];
		}
		id[i]=now;
	}
}
int l,r,q[5010],fail[5010];
void get_fail(){
	q[l=r=0]=0;
	for(int x;l<=r;++l){
		x=q[l];
		for(int i=0;i<26;++i)if(son[x][i]){
			if(x)fail[son[x][i]]=son[fail[x]][i];
			q[++r]=son[x][i];
		}else son[x][i]=son[fail[x]][i];
	}
}
int num[5010],ans[5010];
int main(){
	freopen("ACautomata.in","r",stdin);
	freopen("ACautomata.out","w",stdout);
	scanf("%d",&n);
	build();
	get_fail();
	scanf("%s",ch);
	for(int i=0,now=0;ch[i];++i){
		now=son[now][ch[i]-97];
		++num[now];
	}
	for(int i=cnt;i;--i)
		for(int now=i,j=num[now];now;now=fail[now])
			ans[now]+=j;
	for(int i=0;i<n;++i)
		printf("%s %d\n",s[i],ans[id[i]]);
}