记录编号 380047 评测结果 AAAAAAA
题目名称 AC自动机 最终得分 100
用户昵称 Gravatar_Itachi 是否通过 通过
代码语言 C++ 运行时间 0.374 s
提交时间 2017-03-08 10:11:38 内存使用 25.77 MiB
显示代码纯文本
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=105,maxlen=51,SIZEN=maxn*maxlen*26;
int ch[SIZEN][26],last[SIZEN],v[SIZEN],fail[SIZEN];
int cct[maxn],cnt=0,q[SIZEN];char o[maxn][maxlen],cc[10000010];
void Add(char *s,int num){
	int p=0,x,i,len=strlen(s);
	for(i=0;i<len;i++){
		x=s[i]-'a';
		if(!ch[p][x])ch[p][x]=++cnt;
		p=ch[p][x];
	}
	v[p]=num;
}
void Dig(){
	int rt,i,s=1,t=0,x;
	for(i=0;i<26;i++)if(ch[0][i])q[++t]=ch[0][i];
	while(s<=t){
		rt=q[s++];
		for(i=0;i<26;i++){
			int &u=ch[rt][i];
			if(!u){u=ch[fail[rt]][i];continue;}
			q[++t]=u;x=fail[rt];
			while(x&&!ch[x][i])x=fail[x];
			x=ch[x][i];fail[u]=x;
			last[u]=v[x]?x:last[x];
		}
	}
}
void Add(int i){for(;i;i=last[i])cct[v[i]]++;}
void Run(char *s){
	int len=strlen(s),i,p=0;
	for(i=0;i<len;i++){
		p=ch[p][s[i]-'a'];
		if(v[p])Add(p);
		else if(last[p])Add(last[p]);
	}
}
int main(){
	freopen("ACautomata.in","r",stdin);freopen("ACautomata.out","w",stdout);
	int n,i;scanf("%d",&n);
	for(i=1;i<=n;i++)scanf("%s",o[i]),Add(o[i],i);
	scanf("%s",cc);Dig(),Run(cc);
	for(i=1;i<=n;i++)printf("%s %d\n",o[i],cct[i]);
}