Description
求一个字符串的最长回文串
Input
第一行输入n
接下来n行每行一个只包含英文小写字母的字符串s,字符串长度≤105
保证∑strlen(s)≤105
Output
输出最长回文串的长度
Sample Input
3 abababa aaaabaa acacdas
Sample Output
7 5 3
HINT
请使用复杂度正确的算法。
经典manacher算法
#include<bits/stdc++.h>
using namespace std;
string manacherString(string str)
{
int len=str.size()*2+1;
char res[len];
int index=0;
for(int i=0;i<len;i++)
{
res[i]=(i&1)==0?'#':str[index++];
}
return res;
}
int manacher(string s)
{
string str=manacherString(s);
int pArr[str.size()];
int C=-1;
int R=-1;
int maxn=1;
for(int i=0;i<str.size();i++)
{
pArr[i]=R>i?min(pArr[2*C-i],R-i):1;
while(i+pArr[i]<str.size()&&i-pArr[i]>-1)
{
if(str[i+pArr[i]]==str[i-pArr[i]])
{
pArr[i]++;
}
else
break;
}
if(i+pArr[i]>R)
{
C=i;
R=i+pArr[i];
}
maxn=max(maxn,pArr[i]);
}
return maxn-1;
}
int main()
{
int t;
cin>>t;
while(t--)
{
string str;
cin>>str;
cout<<manacher(str)<<endl;
}
return 0;
}