记录编号 159371 评测结果 AWWWTTWTTTTTWWA
题目名称 审查 最终得分 13
用户昵称 Gravatarggwdwsbs 是否通过 未通过
代码语言 C++ 运行时间 7.047 s
提交时间 2015-04-20 23:32:52 内存使用 103.67 MiB
显示代码纯文本
  1. #include<stdio.h>
  2. #include<vector>
  3. #include<cstring>
  4. #include<queue>
  5. using namespace std;
  6. const int maxn=1e6+10;
  7. struct tire
  8. {
  9. int ch[26];
  10. int fail;
  11. int val;
  12. }tree[maxn];
  13. //vector<tire>tree;
  14. char s1[maxn/10];
  15. char s[maxn];
  16. int vis[maxn];
  17. int leng[maxn];
  18. int pos[maxn];
  19. int n,root=0;
  20. int now,m=0;
  21. int id(char c)
  22. {
  23. return c-'a';
  24. }
  25. int Erase(int l,int r)
  26. {
  27. //for(int i=l;i<=r;i++) vis[i]=1;
  28. while(r>=l)
  29. {
  30. while(vis[r])
  31. {
  32. l--;
  33. r--;
  34. }
  35. vis[r]=1;
  36. r--;
  37. }
  38. }
  39. int build_tire(char *s1,int v)
  40. {
  41. int l=strlen(s1);
  42. now=root;
  43. for(int i=0;i<l;i++)
  44. if(!tree[now].ch[id(s1[i])])
  45. {
  46. m++;
  47. tree[now].ch[id(s1[i])]=m;
  48. now=m;
  49. memset(tree[now].ch,0,sizeof(tree[now].ch));
  50. tree[now].fail=tree[now].val=0;
  51. }
  52. else now=tree[now].ch[id(s1[i])];
  53. tree[now].val=v;
  54. }
  55. int build()
  56. {
  57. scanf("%d",&n);
  58. for(int i=1;i<=n;i++)
  59. {
  60. scanf("%s",s1);
  61. leng[i]=strlen(s1);
  62. build_tire(s1,i);
  63. }
  64. queue<int>q;
  65. tree[root].fail=root;
  66. for(int i=0;i<26;i++)
  67. if(tree[root].ch[i])
  68. {
  69. tree[tree[root].ch[i]].fail=root;
  70. q.push(tree[root].ch[i]);
  71. }
  72. while(q.size()>0)
  73. {
  74. int u=q.front();
  75. q.pop();
  76. for(int i=0;i<26;i++)
  77. {
  78. if(!tree[u].ch[i]) tree[u].ch[i]=tree[tree[u].fail].ch[i];
  79. else
  80. {
  81. int v=tree[u].fail;
  82. while(v&&!tree[v].ch[i]) v=tree[v].fail;
  83. tree[u].fail=tree[v].ch[i];
  84. q.push(tree[u].ch[i]);
  85. }
  86. }
  87. }
  88. }
  89. int find()
  90. {
  91. int l=strlen(s);
  92. int j=0;
  93. for(int i=0;i<l;i++)
  94. {
  95. //while(j&&!tree[j].ch[id(s[i])]) j=tree[j].fail;
  96. j=tree[j].ch[id(s[i])];
  97. if(tree[j].val!=0)
  98. {
  99. Erase(i-leng[tree[j].val]+1,i);
  100. j=pos[i-leng[tree[j].val]];
  101. }
  102. }
  103. }
  104. int main()
  105. {
  106. freopen("censor.in","r",stdin);
  107. freopen("censor.out","w",stdout);
  108. scanf("%s",s);
  109. build();
  110. int l=strlen(s);
  111. int j=0;
  112. for(int i=0;i<l;i++)
  113. {
  114. j=tree[j].ch[id(s[i])];
  115. pos[i]=j;
  116. }
  117. find();
  118. for(int i=0;i<l;i++)
  119. if(!vis[i]) printf("%c",s[i]);
  120. }
  121. /*
  122. begintheescapexecutionatthebreakofdawn
  123. 2
  124. escape
  125. execution*/