记录编号 237453 评测结果 AAAAAAA
题目名称 AC自动机 最终得分 100
用户昵称 Gravatarasddddd 是否通过 通过
代码语言 C++ 运行时间 0.343 s
提交时间 2016-03-17 15:34:55 内存使用 1.54 MiB
显示代码纯文本
#include<iostream>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<queue>
#define maxnode 11000
#define sigma 27
using namespace std;
int count[maxnode];
int ans=0;
struct trie{
	int ch[maxnode][sigma],val[maxnode];
	int f[maxnode],last[maxnode];
	int sv;
	void clear(){
		memset(ch[0],0,sizeof(ch[0]));
		memset(val,0,sizeof(val));
		memset(f,0,sizeof(f));
		memset(last,0,sizeof(last));
		sv=1;
	}
	int idx(char a){
		return a-'a';
	}
	void _insert(const string &s,int v){
		int n=s.size(),u=0;
		for(int i=0;i<n;i++){
            int k=idx(s[i]);
			if(!ch[u][k]){
				memset(ch[sv],0,sizeof(ch[sv]));
				ch[u][k]=sv++;
			}
			u=ch[u][k];
		}
			val[u]=v;
		}
		
	
	void get_fail(){
		queue<int>que;
		for(int i=0;i<sigma;i++){
			int u=ch[0][i];
			if(!u)
			continue;
			que.push(u);
		}
		while(!que.empty()){
			int k=que.front();
			que.pop();
			for(int i=0;i<sigma;i++){
				int u=ch[k][i];
				if(!u)
				continue;
				que.push(u);
				int v=f[k];
				while(v&&!ch[v][i]) v=f[v];
				f[u]=ch[v][i];
				last[u]=val[f[u]]?f[u]:last[f[u]];
			}
		}
	}
	void _find(int j){
		if(j){
			count[val[j]]++;
			_find(last[j]);
		}
	}
	void _find(const string &s){
		int n=s.size(),u=0;
		for(int i=0;i<n;i++){
			int c=idx(s[i]);
			while(u&&!ch[u][c]) u=f[u];
			u=ch[u][c];
			if(val[u]){
				_find(u);
			}
			else if(val[last[u]]){
				_find(last[u]);
			}
		}
	}
};
string hahaha[maxnode];
int main(){
	freopen("ACautomata.in","r",stdin);
	freopen("ACautomata.out","w",stdout);
ios::sync_with_stdio(false);
trie G;
G.clear();
memset(count,0,sizeof(count));
int n;
cin>>n;
for(int j=0;j<n;j++){
	string s;
	cin>>s;
	hahaha[j+1]=s;
	G._insert(s,j+1);
}
string s;
cin>>s;
G.get_fail();
G._find(s);
for(int i=1;i<=n;i++){
	cout<<hahaha[i]<<" "<<count[i]<<endl;
}
}