manacher算法

以前对这个算法不是很理解,只是知道有这个算法,需要的时候网上抄一下,现在大概有些理解了。

 1 #include<bits/stdc++.h>
 2 #define pb push_back
 3 typedef long long ll;
 4 using namespace std;
 5 typedef pair<int, int> pii;
 6 const int maxn = 1e3 + 10;
 7 string s;
 8 void solve() {
 9     cin >> s;
10     stringstream ss;
11     ss << '#';
12     for (char x : s)
13         ss << x << '#';
14     s = ss.str();
15     int n = s.size();
16     vector<int> dp(n, 0);
17     int mr, t;
18     t = mr = 0;
19     ll res = 0;
20     for (int i = 1; i < n; i++) {
21         if(i <= t + dp[t])
22             dp[i] = min(t + dp[t] - i, dp[t * 2 - i]);
23         while(i - dp[i] - 1 >= 0 && i + dp[i] + 1 < n && s[i - dp[i] - 1] == s[i + dp[i] + 1])
24             dp[i]++;
25         if(dp[i] + i >= dp[t] + t)
26             t = i;
27         //cout << dp[i] << endl;
28         res = res + (dp[i] + 1) / 2;
29     }
30     cout <<res <<endl;
31 }
32 
33 int main() {
34     freopen("test.in", "r", stdin);
35     //freopen("test.out", "w", stdout);
36     solve();
37     return 0;
38 }

贴一个hihocode的讲义,里面有manacher的详细讲解。

https://media.hihocoder.com/contests/offer28/offer28.pptx

原文地址:https://www.cnblogs.com/y119777/p/7595220.html