Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define pb push_back
- #define pf push_front
- #define mp make_pair
- #define F first
- #define S second
- #define sz(a) (a).size()
- using namespace std;
- typedef long long ll;
- typedef unsigned long long ull;
- typedef pair < ull, ull > puu;
- const int N = (int)1e6 + 10;
- const puu base = mp(2017, 197);
- int n;
- int ans[N];
- puu h[N], p[N];
- string s;
- vector < int > pos;
- puu get(int l, int r) {
- puu res = h[r];
- 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);
- return res;
- }
- int main () {
- cin >> s;
- n = sz (s);
- p[0] = mp(1, 1);
- h[0] = mp(s[0], s[0]);
- for (int i = 1; i < n; ++i)
- p[i] = mp(p[i - 1].F * base.F, p[i - 1].S * base.S);
- for (int j = 1; j < n; ++j)
- h[j] = mp(h[j - 1].F * base.F + s[j], h[j - 1].S * base.S + s[j]);
- ans[0] = 1;
- for (int i = 1; i < n / 2; ++i)
- ans[i] = 2 * i + 1;
- if (n & 1) ans[n / 2] = n;
- int id = 0;
- for (int i = 1; i < n; ++i) {
- if (s[i] == s[0]) pos.pb (i);
- if (i < n / 2 || (i == n / 2 && n & 1)) continue;
- ans[i] = (s[i] == s[0]);
- if (id != sz (pos)) {
- bool f = 0;
- do {
- int len = (i - pos[id]);
- if (i + len < n) {
- if (get (0, 2 * len) == get (pos[id], i + len)) {
- f = 1;
- ans[i] = 2 * len + 1;
- }
- }
- if (!f) id++;
- } while (f != 1 && id < sz(pos));
- }
- }
- for (int i = 0; i < n; ++i)
- cout << ans[i] << ' ';
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement