Alex_tz307

Manacher

Feb 1st, 2021 (edited)
189
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 0.58 KB | None | 0 0
  1. const int NMAX = 1e6;
  2. int dp[NMAX][2], l[2], r[2];
  3.  
  4. void Manacher() {
  5.   string s;
  6.   cin >> s;
  7.   int N = s.size();
  8.   long long ans = 0;
  9.   r[0] = r[1] = -1;
  10.   for (int i = 0; i < N; ++i)
  11.     for (int par = 0; par < 2; ++par) {
  12.       int flag = !par;
  13.       int k = (i > r[par]) ? par : min(dp[l[par] + r[par] + flag - i][par], r[par] - i + 1);
  14.       while (0 <= i - k - flag && i + k < N && s[i - k - flag] == s[i + k])
  15.         ++k;
  16.       ans += k;
  17.       dp[i][par] = k--;
  18.       if (i + k > r[par])
  19.         l[par] = i - k - flag, r[par] = i + k;
  20.     }
  21.   cout << ans << '\n';
  22. }
Add Comment
Please, Sign In to add comment