马拉车算法(求最长回文子串)

 1 #include <vector>
 2 #include <iostream>
 3 #include <string>
 4 
 5 using namespace std;
 6 
 7 string Manacher(string s) {
 8     // Insert '#'
 9     string t = "$#";
10     for (int i = 0; i < s.size(); ++i) {
11         t += s[i];
12         t += "#";
13     }
14     // Process t
15     vector<int> p(t.size(), 0);
16     int mx = 0, id = 0, resLen = 0, resCenter = 0;
17     for (int i = 1; i < t.size(); ++i) {
18         p[i] = mx > i ? min(p[2 * id - i], mx - i) : 1;
19         while (t[i + p[i]] == t[i - p[i]]) ++p[i];
20         if (mx < i + p[i]) {
21             mx = i + p[i];
22             id = i;
23         }
24         if (resLen < p[i]) {
25             resLen = p[i];
26             resCenter = i;
27         }
28     }
29     return s.substr((resCenter - resLen) / 2, resLen - 1);
30 }
31 
32 int main() {
33     int n;
34     cin>>n;
35     string k;
36      while(n--){
37     cin>>k;
38     cout<<Manacher(k).size()<<endl;
39 }
40     return 0;
41 }

http://hihocoder.com/problemset/problem/1015

猜你喜欢

转载自www.cnblogs.com/wuruofeng/p/9954679.html