1. 程式人生 > >馬拉車演算法(求最長迴文子串)

馬拉車演算法(求最長迴文子串)

 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