题目大意:
求一个字符串中最大双倍回文串的长度(为4的倍数),整个串为回文串,它的一半也是回文串。
题解:manacher+乱搞,不知道为什么网上的大神都用各种高级的方法,可能比较快吧……但我也不慢啊……
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int Q=500005;
char ss[Q],s[Q*2];
int n,len,l,p[Q*2];
int main()
{
scanf("%d%s",&n,ss);
s[0]='@';s[1]='#';
len=2;
l=strlen(ss);
for(int i=0;i<l;i++)
{
s[len++]=ss[i];
s[len++]='#';
}
s[len]='$';
int mx=0,id=0;
p[0]=1;
for(int i=1;i<=len;i++)
{
if(i<mx) p[i]=min(p[id*2-i],mx-i);
else p[i]=1;
while(s[i+p[i]]==s[i-p[i]]) p[i]++;
if(p[i]+i>mx)
{
mx=p[i]+i;
id=i;
}
}
int ans=0;
for(int i=1;i<=len;i+=2)
{
if(p[i]%2==0 || ans>=p[i]-1) continue;
for(int t=i-(p[i]-1)/2;t<i;t++)
if((i-t)*2<=ans) break;
else if((i-t)%2==0 && t+p[t]-1>=i) {ans=max(ans,(i-t)*2);break;}
}
printf("%d",ans);
}