Rkhamim

Untitled

Apr 14th, 2021
178
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.01 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int N = 200005;
  4. const int K = 26;
  5. int node;
  6. int Next[K][N], fail[N], num[N];
  7. bool endMark[N], vis[N];
  8. void init()
  9. {
  10. node = 0;
  11. for(int i = 0; i < K; i++) {
  12. for(int j = 0; j < N; j++) {
  13. Next[i][j] = 0;
  14. }
  15. }
  16. for(int i = 0; i < N; i++) {
  17. endMark[i] = false;
  18. vis[i] = false;
  19. fail[i] = 0;
  20. num[i] = 0;
  21. }
  22. }
  23.  
  24. void Insert(string s)
  25. {
  26. int v = 0;
  27. for(int i = 0; i < s.size(); i++) {
  28. int id = s[i] - 'a';
  29. if(!vis[Next[id][v]]) {
  30. Next[id][v] = ++node;
  31. vis[node] = true;
  32. }
  33. v = Next[id][v];
  34. }
  35. endMark[v] = true;
  36. }
  37.  
  38. void build_fail()
  39. {
  40. queue<int>q;
  41.  
  42. for(int i = 0; i < K; i++) {
  43. if(vis[Next[i][0]]) {
  44. q.push(Next[i][0]); // root's child
  45. }
  46. }
  47.  
  48. while(!q.empty()) {
  49. int u = q.front();
  50. q.pop();
  51. for(int i = 0; i < K; i++) {
  52. int v = Next[i][u];
  53. if(!vis[v]) continue;
  54. q.push(v);
  55. int p = fail[u];
  56. while(p && vis[Next[i][p]]==0) {
  57. p = fail[p];
  58. }
  59. fail[v] = Next[i][p];
  60. }
  61. }
  62. }
  63. void Search(string s)
  64. {
  65. int v = 0;
  66. for(int i = 0; i < s.size(); i++) {
  67. int id = s[i] - 'a';
  68. while(v && !vis[Next[id][v]]) {
  69. v = fail[v];
  70. }
  71. v = Next[id][v];
  72. int tmp = v;
  73. while(tmp) {
  74. num[tmp]++;
  75. tmp = fail[tmp];
  76. }
  77. }
  78. }
  79. int main()
  80. {
  81. init();
  82.  
  83. string s;
  84. cin>>s;
  85.  
  86. int n;
  87. cin>>n;
  88. while(n--) {
  89. string a;
  90. cin>>a;
  91. Insert(a);
  92. }
  93. build_fail();
  94. Search(s);
  95. for(int i = 0; i <= node; i++) {
  96. if(endMark[i]) {
  97. //if no two string has same common prefix
  98. cout<<num[i]<<endl; // number of occurance of a word
  99. }
  100. }
  101.  
  102. return 0;
  103. }
  104.  
Advertisement
Add Comment
Please, Sign In to add comment