记录编号 377149 评测结果 AAAAAAA
题目名称 AC自动机 最终得分 100
用户昵称 GravatarAntiLeaf 是否通过 通过
代码语言 C++ 运行时间 0.208 s
提交时间 2017-02-28 20:34:34 内存使用 0.87 MiB
显示代码纯文本
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=110,maxm=5010;
void insert(const char*,int);
void getfail();
void match();
int val[maxm]={0},ch[maxm][26]={{0}},f[maxm]={0},q[maxm],cnt=0,a[maxm]={0};
char s[maxn][55];
int n,ans[maxn];
int main(){
	freopen("ACautomata.in","r",stdin);
	freopen("ACautomata.out","w",stdout);
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%s",s[i]);
		insert(s[i],i);
	}
	getfail();
	match();
	for(int i=cnt-1;i>=0;i--){
		if(val[q[i]])ans[val[q[i]]]=a[q[i]];
		a[f[q[i]]]+=a[q[i]];
	}
	for(int i=1;i<=n;i++)printf("%s %d\n",s[i],ans[i]);
	return 0;
}
void insert(const char* c,int id){
	int x=0;
	while(*c){
		if(!ch[x][*c-'a'])ch[x][*c-'a']=++cnt;
		x=ch[x][*c++-'a'];
	}
	val[x]=id;
}
void getfail(){
	int x,y,head=0,tail=0;
	for(int c=0;c<26;c++)if(ch[0][c])q[tail++]=ch[0][c];
	while(head!=tail){
		x=q[head++];
		for(int c=0;c<26;c++){
			if(ch[x][c]){
				y=f[x];
				while(y&&!ch[y][c])y=f[y];
				f[ch[x][c]]=ch[y][c];
				q[tail++]=ch[x][c];
			}
			else ch[x][c]=ch[f[x]][c];
		}
	}
}
void match(){
	int x=0,c;
	for(;;){
		do c=getchar();while(c!=EOF&&(c<'a'||c>'z'));
		if(c==EOF)break;
		x=ch[x][c-'a'];
		a[x]++;
	}
}