记录编号 566817 评测结果 AAAAAAA
题目名称 AC自动机 最终得分 100
用户昵称 Gravataryrtiop 是否通过 通过
代码语言 C++ 运行时间 0.231 s
提交时间 2021-11-16 22:10:58 内存使用 28.90 MiB
显示代码纯文本
  1. #include <cstdio>
  2. #include <cstring>
  3. #include <algorithm>
  4. #include <queue>
  5. using namespace std;
  6. const int maxn = 505;
  7. const int SIZE = 26;
  8. char s[15][55];
  9. char t[100000005];
  10. int trie[maxn][SIZE],in[maxn],val[maxn],ans[maxn],Realans[maxn],fail[maxn];
  11. int n,rt,sz;
  12. queue<int> q;
  13. void insert(char* s,int number) {
  14. int len = strlen(s + 1),u = rt;
  15. for(int i = 1;i <= len;++ i) {
  16. int c = s[i] - 'a';
  17. if(!trie[u][c])trie[u][c] = ++ sz;
  18. u = trie[u][c];
  19. }
  20. val[u] = number;
  21. return ;
  22. }
  23. void bfs() {
  24. for(int i = 0;i < SIZE;++ i) {
  25. if(!trie[rt][i])continue ;
  26. fail[trie[rt][i]] = rt;
  27. q.push(trie[rt][i]);
  28. }
  29. while(!q.empty()) {
  30. int u = q.front();
  31. q.pop();
  32. for(int i = 0;i < SIZE;++ i) {
  33. int& v = trie[u][i];
  34. if(!v) {
  35. v = trie[fail[u]][i];
  36. continue ;
  37. }
  38. else {
  39. fail[v] = trie[fail[u]][i];
  40. ++ in[fail[v]];
  41. q.push(v);
  42. }
  43. }
  44. }
  45. return ;
  46. }
  47. void query(char* s) {
  48. int len = strlen(s + 1),u = rt;
  49. for(int i = 1;i <= len;++ i) {
  50. int c = s[i] - 'a';
  51. u = trie[u][c];
  52. ++ ans[u];
  53. }
  54. return ;
  55. }
  56. void TopoSort() {
  57. for(int i = 0;i <= sz;++ i) {
  58. if(!in[i])q.push(i);
  59. }
  60. while(!q.empty()) {
  61. int u = q.front();
  62. q.pop();
  63. Realans[val[u]] = ans[u];
  64. ans[fail[u]] += ans[u];
  65. if(!-- in[fail[u]])q.push(fail[u]);
  66. }
  67. return ;
  68. }
  69. int main() {
  70. freopen("ACautomata.in","r",stdin);
  71. freopen("ACautomata.out","w",stdout);
  72. rt = 0;
  73. scanf("%d",&n);
  74. for(int i = 1;i <= n;++ i) {
  75. scanf("%s",s[i] + 1);
  76. insert(s[i] , i);
  77. }
  78. bfs();
  79. scanf("%s",t + 1);
  80. query(t);
  81. TopoSort();
  82. for(int i = 1;i <= n;++ i) {
  83. printf("%s %d\n",s[i] + 1,Realans[i]);
  84. }
  85. fclose(stdin);
  86. fclose(stdout);
  87. return 0;
  88. }