Advertisement
Guest User

Untitled

a guest
Apr 19th, 2018
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.44 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. #define pb push_back
  4. #define pf push_front
  5.  
  6. #define mp make_pair
  7. #define F first
  8. #define S second
  9.  
  10. #define sz(a) (a).size()
  11.  
  12. using namespace std;
  13.  
  14. typedef long long ll;
  15. typedef unsigned long long ull;
  16. typedef pair < ull, ull > puu;
  17.  
  18. const int N = (int)1e6 + 10;
  19. const puu base = mp(2017, 197);
  20.  
  21. int n;
  22. int ans[N];
  23.  
  24. puu h[N], p[N];
  25.  
  26. string s;
  27.  
  28. vector < int > pos;
  29.  
  30. puu get(int l, int r) {
  31. puu res = h[r];
  32. if (l != 0) res = mp(res.F - h[l - 1].F * p[r - l + 1].F, res.S - h[l - 1].S * p[r - l + 1].S);
  33. return res;
  34. }
  35.  
  36. int main () {
  37. cin >> s;
  38. n = sz (s);
  39.  
  40. p[0] = mp(1, 1);
  41. h[0] = mp(s[0], s[0]);
  42. for (int i = 1; i < n; ++i)
  43. p[i] = mp(p[i - 1].F * base.F, p[i - 1].S * base.S);
  44. for (int j = 1; j < n; ++j)
  45. h[j] = mp(h[j - 1].F * base.F + s[j], h[j - 1].S * base.S + s[j]);
  46.  
  47. ans[0] = 1;
  48. for (int i = 1; i < n / 2; ++i)
  49. ans[i] = 2 * i + 1;
  50. if (n & 1) ans[n / 2] = n;
  51. int id = 0;
  52. for (int i = 1; i < n; ++i) {
  53. if (s[i] == s[0]) pos.pb (i);
  54. if (i < n / 2 || (i == n / 2 && n & 1)) continue;
  55. ans[i] = (s[i] == s[0]);
  56. if (id != sz (pos)) {
  57. bool f = 0;
  58. do {
  59. int len = (i - pos[id]);
  60. if (i + len < n) {
  61. if (get (0, 2 * len) == get (pos[id], i + len)) {
  62. f = 1;
  63. ans[i] = 2 * len + 1;
  64. }
  65. }
  66. if (!f) id++;
  67. } while (f != 1 && id < sz(pos));
  68. }
  69. }
  70. for (int i = 0; i < n; ++i)
  71. cout << ans[i] << ' ';
  72. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement