Description
给一个字符串,输出它的最长回文子串长度。
Input
一行一个字符串。
Output
一行一个整数表示长度。
abbabbaabbabaab
-
Sample Input
10
-
Sample Output
HINT
len≤1000000
Updated By MCHacker
马拉车模板
#include <iostream>
#include <cstdio>
#include <string>
#include <vector>
using namespace std;
string manacher(string str) {
string s = "@|";
for (int i=0; i<str.size(); ++i) { // 插入分隔符
s += str[i]; s += "|";
}
vector<int> dp(s.size());
int m=0, id=0, mx=0, center=0;
for (int i=1; i<s.size(); ++i) {
if (m>i) dp[i] = min(dp[(id<<1)-i], m-i);
else dp[i] = 1;
while (s[i+dp[i]]==s[i-dp[i]]) ++dp[i]; // 接下来直接暴力
if (m<i+dp[i]) {
m = i+dp[i]; id = i; // 更新最右端
}
if (mx<dp[i]) {
mx = dp[i]; center = i; // 更新结果,中心
}
}
return str.substr((center-mx)>>1, mx-1); // 返回最长回文串
}
int main() {
string str; cin >> str;
printf("%d", manacher(str).size());
return 0;
}