cheater2k

Template - 11th POI

Nov 30th, 2016
180
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.08 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. using namespace std;
  4.  
  5. const int N = 500010;
  6.  
  7. int n, Z[N];
  8. string s;
  9. vector <int> pos[N];
  10. int le[N], ri[N];
  11. int mx = 0;
  12. int ans = 1e9;
  13.  
  14. void del(int x) {
  15.     int l = le[x], r = ri[x];
  16.     mx = max(mx, r - l);
  17.     ri[l] = r;
  18.     le[r] = l;
  19. }
  20.  
  21. int main() {
  22.     ios_base::sync_with_stdio(false); cin.tie(0);
  23.     cin >> s; n = s.size(); s = ' ' + s;
  24.     Z[1] = n;
  25.     int l = 0, r = 0;
  26.     for (int i = 2; i <= n; ++i) {
  27.         if (r < i) {
  28.             l = r = i; while(r <= n && s[r] == s[r - l + 1]) ++r;
  29.             Z[i] = r - l; --r;
  30.         }
  31.         else {
  32.             int k = i - l + 1;
  33.             if (Z[k] < r - i) Z[i] = Z[k];
  34.             else {
  35.                 l = i; while(r <= n && s[r] == s[r - l + 1]) ++r;
  36.                 Z[i] = r - l; --r;
  37.             }
  38.         }
  39.         pos[Z[i]].push_back(i);
  40.     }
  41.    
  42.     le[0] = 0; ri[0] = 1; le[n+1] = n; ri[n+1] = n+1;
  43.     for (int i = 1; i <= n; ++i) le[i] = i-1, ri[i] = i+1;
  44.  
  45.     for (int len = 1; len <= n; ++len) {
  46.         for (int i = 0; i < pos[len-1].size(); ++i) del(pos[len-1][i]);
  47.         if (mx > len) continue;
  48.         else {
  49.             if (Z[n - len + 1] == len) { ans = len; break; }
  50.         }
  51.     }
  52.  
  53.     cout << ans << endl;
  54. }
Advertisement
Add Comment
Please, Sign In to add comment