Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- vector<int> ZFunction(string s) {
- int n = s.size();
- vector<int> z(n, 0);
- int L = 0, R = 0;
- for (int i = 1; i < n; i++) {
- if (i > R) {
- L = R = i;
- while (R < n && s[R - L] == s[R]) R++;
- z[i] = R - L; R--;
- } else {
- int k = i-L;
- if (z[k] < R - i + 1) z[i] = z[k];
- else {
- L = i;
- while (R < n && s[R - L] == s[R]) R++;
- z[i] = R - L; R--;
- }
- }
- }
- return z;
- }
- struct DSU {
- int n; vector<int> L, R; vector<bool> ers;
- DSU(int n) : n(n), L(n), R(n), ers(n, false) {
- for (int i = 0; i < n; ++i)
- L[i] = R[i] = i;
- }
- int Erase(int x) {
- int ret = -1;
- int l = (x == 0 ? -1 : L[x - 1]);
- int r = (x + 1 == n ? -1 : R[x + 1]);
- if (l != -1 && r != -1) {
- ret = r - l;
- }
- if (l != -1) R[l + 1] = r;
- if (r != -1) L[r - 1] = l;
- ers[x] = true;
- return ret;
- }
- };
- int main() {
- string s; cin >> s;
- int n = s.size();
- auto z = ZFunction(s);
- vector<int> dp(n, 0);
- z[0] = n;
- vector<pair<int, int>> v(n);
- for (int i = 0; i < n; ++i)
- v[i] = make_pair(z[i], i);
- sort(v.begin(), v.end());
- int at = 0;
- int max_diff = 1;
- DSU dsu(n);
- for (int len = 1; len <= n; ++len) {
- while (at < n && v[at].first < len) {
- max_diff = max(max_diff, dsu.Erase(v[at].second));
- ++at;
- }
- if (max_diff <= len && !dsu.ers[n - len]) {
- cout << len << endl;
- return 0;
- }
- }
- assert(false);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement