回文串是指aba、abba、cccbccc、aaaa这种左右对称的字符串。
输入一个字符串Str,输出Str里最长回文子串的长度。
Input
输入Str(Str的长度 <= 100000)
Output
输出最长回文子串的长度L。
Input示例
daabaac
Output示例
5
新知: Manacher算法是用来求“一个字符串中最大回文串”的线性算法,时间复杂度为O(n)。
讲解: 有什么浅显易懂的Manacher Algorithm讲解? - 233 Magic的回答 - 知乎
https://www.zhihu.com/question/37289584/answer/71483487
AC代码:
#include<bits/stdc++.h>
using namespace std;
const int MAX = 100005;
char s[MAX];
char ma[MAX<<1];
int mp[MAX<<1];
int manacher(char s[],int len)
{
int l = 0;
ma[l++] = '$';
ma[l++] = '#';
for(int i=0;i<len;i++)
{
ma[l++] = s[i];
ma[l++] = '#';
}
ma[l] = '\0';
int id = 0,mx = 0;
int ans = -1;
for(int i=0;i<l;i++)
{
mp[i] = mx>i?min(mp[2*id-i],mx-i):1;
while(ma[i+mp[i]] == ma[i-mp[i]]) mp[i]++;
if(i+mp[i]>mx)
{
mx = i+mp[i];
id = i;
}
ans = max(ans,mp[i]-1);
}
return ans;
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
cin>>s;
cout<<manacher(s,strlen(s))<<endl;
return 0;
}