Advertisement
Guest User

Untitled

a guest
Oct 5th, 2016
265
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.89 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define int long long
  3.  
  4. using namespace std;
  5.  
  6. const int MOD = 1999999943;
  7. const int MD = 1000000007;
  8. int BASE = 239;
  9.  
  10. struct hash_str {
  11. vector <int> h, p;
  12. vector <int> h1, p1;
  13. hash_str(string s) {
  14. int n = (int) s.size();
  15. h.resize(n);
  16. p.resize(n);
  17. h1.resize(n);
  18. p1.resize(n);
  19. h[0] = h1[0] = s[0];
  20. p[0] = p1[0] = 1;
  21. for (int i = 1; i < n; i++) {
  22. h[i] = (h[i - 1] * BASE + s[i]) % MOD;
  23. h1[i] = (h1[i - 1] * BASE + s[i]) % MD;
  24. p[i] = (p[i - 1] * BASE) % MOD;
  25. p1[i] = (p1[i - 1] * BASE) % MD;
  26. }
  27. }
  28. int get(int l, int r) {
  29. int res = h[r] - (l ? (h[l - 1] * p[r - l + 1]) % MOD : 0);
  30. if (res < 0) {
  31. res += MOD;
  32. }
  33. return res;
  34. }
  35. int gt(int l, int r) {
  36. int res = h1[r] - (l ? (h1[l - 1] * p1[r - l + 1]) % MD : 0);
  37. if (res < 0) {
  38. res += MD;
  39. }
  40. return res;
  41. }
  42.  
  43. };
  44.  
  45. set <pair <int, int> > diff1, diff2;
  46.  
  47. main() {
  48. srand(time(NULL));
  49. //freopen("input.txt", "r", stdin);
  50. //freopen("output.txt", "w", stdout);
  51. BASE = 0;
  52. while (BASE < 255) {
  53. BASE = rand();
  54. }
  55. string s, t;
  56. cin >> s;
  57. t = s;
  58. reverse(t.begin(), t.end());
  59. hash_str h(s);
  60. hash_str q(t);
  61. int n = s.size();
  62. vector <int> p(n);
  63. for (int i = 0; i < n; i++) {
  64. int l = 1, r = n;
  65. while (l < r - 1) {
  66. int m = (l + r) / 2;
  67. if (i + m - 1 < n && i - m + 1 >= 0) {
  68. int left = i - m + 1;
  69. int right = i + m - 1;
  70. if (h.get(left, right) == q.get(n - 1 - right, n - 1 - left)) {
  71. l = m;
  72. } else {
  73. r = m;
  74. }
  75. } else {
  76. r = m;
  77. }
  78. }
  79. int d = l;
  80. int left = i - d + 1, right = i + d - 1;
  81. while (d > 0) {
  82. int left = i - d + 1, right = i + d - 1;
  83. if (h.get(left, right) != q.get(n - 1 - right, n - 1 - left)) {
  84. break;
  85. }
  86. if (left > right) {
  87. break;
  88. }
  89. int hush = h.get(left, right);
  90. int hesh = h.gt(left, right);
  91. if (diff1.count(make_pair(hush, hesh))) {
  92. break;
  93. } else {
  94. diff1.insert(make_pair(hush, hesh));
  95. p[right]++;
  96. d--;
  97. }
  98. }
  99. }
  100. for (int i = 0; i < n; i++) {
  101. int l = 0, r = n;
  102. while (l < r - 1) {
  103. int m = (l + r) / 2;
  104. if (i + m < n && i - m + 1 >= 0) {
  105. int left = i - m + 1;
  106. int right = i + m;
  107. if (h.get(left, right) == q.get(n - 1 - right, n - 1 - left)) {
  108. l = m;
  109. } else {
  110. r = m;
  111. }
  112. } else {
  113. r = m;
  114. }
  115. }
  116. int d = l;
  117. int left = i - d + 1, right = i + d;
  118. while (d > 0) {
  119. int left = i - d + 1, right = i + d;
  120. if (h.get(left, right) != q.get(n - 1 - right, n - 1 - left)) {
  121. break;
  122. }
  123. if (left > right) {
  124. break;
  125. }
  126. int hush = h.get(left, right);
  127. int hesh = h.gt(left, right);
  128. if (diff2.count(make_pair(hush, hesh))) {
  129. break;
  130. } else {
  131. diff2.insert(make_pair(hush, hesh));
  132. p[right]++;
  133. d--;
  134. }
  135. }
  136. }
  137. int ans = 0;
  138. for (int i = 0; i < n; i++) {
  139. ans += p[i];
  140. cout << ans << " ";
  141. }
  142. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement