记录编号 |
214633 |
评测结果 |
AAAAAAT |
题目名称 |
AC自动机 |
最终得分 |
85 |
用户昵称 |
一個人的雨 |
是否通过 |
未通过 |
代码语言 |
C++ |
运行时间 |
1.096 s |
提交时间 |
2015-12-17 11:12:20 |
内存使用 |
81.38 MiB |
显示代码纯文本
#include<map>
#include<set>
#include<queue>
#include<cmath>
#include<cstdio>
#include<vector>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=500000+10;
const int maxs=26;
char buf[maxn][50];
int ans[maxn],n;
struct trie{
int next[maxn][maxs];
int fail[maxn],end[maxn],whi[maxn];
int root,l;
int new_node(){
for (int i=0;i<26;i++) next[l][i]=-1;
end[l]=whi[l]=0; return l++;
}
void init(){
l=0;
root=new_node();
}
void insert(int k,char buf[]){
int len=strlen(buf);
int now=root;
for (int i=0;i<len;i++){
int x=buf[i]-'a';
if (next[now][x]==-1)
next[now][x]=new_node();
now=next[now][x];
} end[now]++; whi[now]=k;
}
void build(){
queue<int>q; fail[root]=root;
for (int i=0;i<26;i++)
if (next[root][i]==-1) next[root][i]=root;
else{
fail[next[root][i]]=root;
q.push(next[root][i]);
}
while (!q.empty()){
int now=q.front(); q.pop();
for (int i=0;i<26;i++)
if (next[now][i]==-1) next[now][i]=next[fail[now]][i];
else{
fail[next[now][i]]=next[fail[now]][i];
q.push(next[now][i]);
}
}
}
void Q(char buf[]){
int now=root,len=strlen(buf);
for (int i=0;i<len;i++){
now=next[now][buf[i]-'a'];
int tmp=now;
while (tmp!=root){
if (end[tmp])
ans[whi[tmp]]+=end[tmp];
tmp=fail[tmp];
}
}
}
};
trie AC;
int main(){
freopen("ACautomata.in","r",stdin);
freopen("ACautomata.out","w",stdout);
scanf("%d",&n);
AC.init();
for (int i=1;i<=n;i++){
scanf("%s",buf[i]);
AC.insert(i,buf[i]);
}
AC.build();
scanf("%s",buf[n+1]);
AC.Q(buf[n+1]);
for (int i=1;i<=n;i++){
printf("%s",buf[i]);
printf(" %d\n",ans[i]);
}
}