比赛 20150420 评测结果 AAAAAAAAAAAAATA
题目名称 审查 最终得分 93
用户昵称 Chenyao2333 运行时间 1.221 s
代码语言 C++ 内存使用 124.29 MiB
提交时间 2015-04-20 09:10:44
显示代码纯文本
  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. #include<queue>
  5. using namespace std;
  6. const int L_N=1e6+10;
  7.  
  8. int last[L_N],f[L_N],nxt[L_N][26],val[L_N],node_cnt;
  9. int M;
  10.  
  11. char str[L_N],tmps[L_N];
  12. int nt[L_N],lt[L_N],pos[L_N],N;
  13.  
  14. int get_nxt(int fa[],int i){
  15. if(fa[i]!=i) fa[i]=get_nxt(fa,fa[i]);
  16. return fa[i];
  17. }
  18. int idx(int c){
  19. return c-'a';
  20. }
  21.  
  22. int main(){
  23. freopen("censor.in","r",stdin);
  24. freopen("censor.out","w",stdout);
  25. scanf("%s",str+1);
  26. scanf("%d",&M);
  27. for(int i=1;i<=M;i++){
  28. scanf("%s",&tmps);
  29. int x=0,j=0;
  30. for(j=0;tmps[j];j++){
  31. int c=idx(tmps[j]);
  32. if(!nxt[x][c]) nxt[x][c]=++node_cnt;
  33. x=nxt[x][c];
  34. }
  35. val[x]=j;
  36. }
  37. queue<int> q;
  38. for(int i=0;i<26;i++) if(nxt[0][i]){
  39. int x=nxt[0][i];
  40. q.push(x);
  41. if(val[x]) f[x]=x;
  42. }
  43. while(q.size()){
  44. int u=q.front(); q.pop();
  45. for(int i=0;i<26;i++)if(nxt[u][i]){
  46. int v=nxt[u][i];
  47. int j=last[u];
  48. while(j && !nxt[j][i]) j=last[j];
  49. if(nxt[j][i]) j=nxt[j][i];
  50. last[v]=j;
  51. f[v]=val[v]?v:f[j];
  52. q.push(v);
  53. }
  54. }
  55. N=strlen(str+1);
  56. for(int i=1;i<=N+1;i++) nt[i]=lt[i]=i;
  57. int j=0;
  58. for(int i=1;i<=N;i=get_nxt(nt,i+1)){
  59. int c=idx(str[i]);
  60. while(j && !nxt[j][c]) j=last[j];
  61. if(nxt[j][c]) j=nxt[j][c];
  62. pos[i]=j;
  63. if(f[j]){
  64. j=f[j];
  65. int len=val[j];
  66.  
  67. while(len--){
  68. nt[i]=i+1;
  69. lt[i]=i-1;
  70. i=get_nxt(lt,i);
  71. }
  72. j=pos[i];
  73. }
  74. }
  75. for(int i=get_nxt(nt,1); i<=N; i=get_nxt(nt,i+1)){
  76. printf("%c",str[i]);
  77. }
  78. printf("\n");
  79. return 0;
  80. }