记录编号 191101 评测结果 AAAAAAT
题目名称 AC自动机 最终得分 85
用户昵称 Gravatarstdafx.h 是否通过 未通过
代码语言 C++ 运行时间 1.092 s
提交时间 2015-10-06 16:17:58 内存使用 19.43 MiB
显示代码纯文本
//algorithm::ac_automata

#define MAXN 1010UL
#define MAXL 51UL
#define MAXE 20000010UL
#define MAXS 26UL

#include <cstdio>
#include <cstring>
#include <queue>

struct Node{
	int id;
	Node *ch[MAXS],*fail;
	Node(){id=0;for(int i=0;i<MAXS;i++) ch[i]=NULL;fail=NULL;return;}
};

Node *root=new Node();

char str[MAXN][MAXL],s[MAXE];
int n,t,Ans[MAXN],len;
std::queue<Node*> que;

inline void Add_Trie(char *p,int id){
	Node *r=root;
	for(;*p;r=r->ch[t],p++){
		t=*p-'a';
		if(!r->ch[t]) r->ch[t]=new Node();	
	}
	r->id=id;return;
}

int main(){
	freopen("ACautomata.in","r",stdin);freopen("ACautomata.out","w",stdout);
	scanf("%d",&n);
	for(int i=1;i<=n;i++) scanf("%s",str[i]),Add_Trie(str[i],i);
	que.push(root);
	while(!que.empty()){
		Node *tmp=que.front();que.pop();
		for(t=0;t<MAXS;t++){
			if(tmp->ch[t]){
				Node *p=tmp->fail;
				while(p&&(!p->ch[t])) p=p->fail;
				if(!p) tmp->ch[t]->fail=root;
				else tmp->ch[t]->fail=p->ch[t];
				que.push(tmp->ch[t]);
			}
		}
	}
	scanf("%s",s);len=strlen(s);Node *tmp=root;
	for(int i=0;i<len;i++){
		t=s[i]-'a';
		while(tmp&&!tmp->ch[t]) tmp=tmp->fail;
		if(!tmp) tmp=root;
		else tmp=tmp->ch[t];
		Node *p=tmp;
		while(p) Ans[p->id]++,p=p->fail;
	}
	for(int i=1;i<=n;i++){
		printf("%s %d\n",str[i],Ans[i]);
	}
	return 0;
}