记录编号 159194 评测结果 AAAAAAAAAAAAAAA
题目名称 审查 最终得分 100
用户昵称 GravatarAsm.Def 是否通过 通过
代码语言 C++ 运行时间 0.194 s
提交时间 2015-04-20 12:04:25 内存使用 17.19 MiB
显示代码纯文本
  1. #include <cstdio>
  2. #include <cstring>
  3. #include <cstdlib>
  4. #include <ctime>
  5. #include <cctype>
  6. #include <algorithm>
  7. #include <cmath>
  8. using namespace std;
  9. //#define USEFREAD
  10. #ifdef USEFREAD
  11. #define InputLen 5000000
  12. char *ptr=(char *)malloc(InputLen);
  13. #define getc() (*(ptr++))
  14. #else
  15. #define getc() (getchar())
  16. #endif
  17. #define SetFile(x) (freopen(#x".in", "r", stdin), freopen(#x".out", "w", stdout))
  18. template<class T>inline void getd(T &x){
  19. char ch = getc();bool neg = false;
  20. while(!isdigit(ch) && ch != '-')ch = getc();
  21. if(ch == '-')ch = getc(), neg = true;
  22. x = ch - '0';
  23. while(isdigit(ch = getc()))x = x * 10 - '0' + ch;
  24. if(neg)x = -x;
  25. }
  26. /***********************************************************************/
  27. const int maxn = 1000005, Sig = 26, maxm = 100005;
  28. struct Trie *Root = NULL;
  29. struct Trie{
  30. Trie *son[Sig], *fail;
  31. int rec;
  32. inline Trie *trans(int ch){
  33. if(son[ch])return son[ch];
  34. return fail ? fail->trans(ch) : Root;
  35. }
  36. }trie[maxm], *Pit = trie;
  37.  
  38. char T[maxn], S[maxm], *begin[maxm], ans[maxn], *Ait = ans;
  39. int Scnt;
  40.  
  41. void insert(Trie *&cur, char *it, char *end, int id){
  42. if(cur == NULL)cur = Pit++;
  43. if(it == end){
  44. cur->rec = id;
  45. return;
  46. }
  47. insert(cur->son[*it - 'a'], it+1, end, id);
  48. }
  49. #include <queue>
  50. inline void Build(){
  51. queue<Trie *> Q;
  52. Trie *t, **s;
  53. int i;
  54. for(i = 0,s = Root->son;i < Sig;++i,++s)if(*s){
  55. (*s)->fail = Root;
  56. Q.push(*s);
  57. }
  58. while(!Q.empty()){
  59. t = Q.front();Q.pop();
  60. for(i = 0,s = t->son;i < Sig;++i,++s){
  61. if(*s){
  62. (*s)->fail = t->fail->trans(i);
  63. Q.push(*s);
  64. }
  65. else *s = t->trans(i);
  66. }
  67. }
  68. }
  69.  
  70. inline void init(){
  71. begin[1] = S;
  72. scanf("%s", T);
  73. getd(Scnt);
  74. int i;
  75. char *it;
  76. for(i = 1;i <= Scnt;++i){
  77. it = begin[i];
  78. while(!isalpha(*it = getc()));++it;
  79. while(isalpha(*it = getc()))++it;
  80. insert(Root, begin[i], begin[i+1] = it, i);
  81. }
  82. Build();
  83. }
  84.  
  85. Trie *loc[maxn], **lit = loc;
  86. inline void work(){
  87. Trie *t = Root;
  88. char *it = T;
  89. int tmp, d;
  90. *(lit++) = Root;
  91. while(*it){
  92. t = t->trans(*it - 'a');
  93. *(Ait++) = *it;
  94. *(lit++) = t;
  95. if((tmp = t->rec)){
  96. d = begin[tmp+1] - begin[tmp];
  97. Ait -= d;lit -= d;
  98. t = *(lit - 1);
  99. }
  100. ++it;
  101. }
  102. *Ait = 0;
  103. printf("%s\n", ans);
  104. }
  105.  
  106. int main(){
  107. #ifdef DEBUG
  108. freopen("test.txt", "r", stdin);
  109. #else
  110. SetFile(censor);
  111. #endif
  112. #ifdef USEFREAD
  113. fread(ptr,1,InputLen,stdin);
  114. #endif
  115. init();
  116. work();
  117. #ifdef DEBUG
  118. printf("\n%.3lf sec \n", (double)clock() / CLOCKS_PER_SEC);
  119. #endif
  120. return 0;
  121. }