Advertisement
Guest User

Untitled

a guest
Mar 30th, 2015
239
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.91 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define TASK "count"
  5.  
  6. const int ALPHA = 256;
  7. const int MAXN = 2000000;
  8. const int INF = (int) 1e9;
  9.  
  10. int tid;
  11. struct node
  12. {
  13. int go[ALPHA];
  14. int link;
  15. int pos, len;
  16.  
  17. node() {}
  18.  
  19. node(int pos, int len = INF)
  20. : link(0)
  21. , pos(pos)
  22. , len(len)
  23. {
  24. memset(go, 0, sizeof go);
  25. }
  26.  
  27. } t[MAXN];
  28.  
  29. int make_node(int pos, int len = INF)
  30. {
  31. t[tid] = node(pos, len);
  32. return tid++;
  33. }
  34.  
  35. int s[MAXN];
  36. int n;
  37. int cur, pos;
  38. void ukkadd(int c)
  39. {
  40. s[n++] = c;
  41. ++pos;
  42. int last = 0;
  43. while (pos > 0) {
  44. while (t[t[cur].go[s[n - pos]]].len < pos) {
  45. cur = t[cur].go[s[n - pos]];
  46. pos -= t[cur].len;
  47. }
  48.  
  49. int& next = t[cur].go[s[n - pos]];
  50. int end_char = s[t[next].pos + pos - 1];
  51. if (next == 0) {
  52. next = make_node(n - pos);
  53. t[last].link = cur;
  54. last = 0;
  55. } else if (c == end_char) {
  56. t[last].link = cur;
  57. return;
  58. } else {
  59. int u = make_node(t[next].pos, pos - 1);
  60. t[u].go[c] = make_node(n - 1);
  61. t[u].go[end_char] = next;
  62. t[next].pos += pos - 1;
  63. t[next].len -= pos - 1;
  64. next = u;
  65. t[last].link = u;
  66. last = u;
  67. }
  68. if (cur == 0) {
  69. --pos;
  70. } else {
  71. cur = t[cur].link;
  72. }
  73. }
  74. }
  75.  
  76. int main()
  77. {
  78. freopen(TASK ".in", "r", stdin);
  79. freopen(TASK ".out", "w", stdout);
  80. ios_base::sync_with_stdio(false);
  81.  
  82. t[0].len = INF;
  83. tid = 1;
  84.  
  85. string s;
  86. cin >> s;
  87.  
  88. for (int i = 0; i < (int) s.size(); i++) {
  89. ukkadd((int) s[i]);
  90. }
  91.  
  92. long long ans = 0;
  93. for (int i = 1; i < tid; i++) {
  94. ans += min(n - t[i].pos, t[i].len);
  95. }
  96.  
  97. cout << ans << endl;
  98. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement