题目链接:点击查看
题意:找一个回文串,他的一半也是回文串,并且长度是4的倍数
题解:马拉车算法跑一遍,记录每一个r[i]值,在判断左半部分的是否符合条件,负责度?
#include<bits/stdc++.h>
using namespace std;
const int N=500100;
char s[N],str[N*2];
int n,r[N*2];
int main()
{
while(~scanf("%d",&n))
{
scanf("%s",s);
int len=strlen(s);
str[0]='+';
str[1]='#';
for(int i=0;i<len;i++)
{
str[i*2+2]=s[i];
str[i*2+3]='#';
}
str[len*2+2]='-';
len=len*2+2;
int maxx=0,ans=0,id;
int cnt;
for(int i=2;i<len;i++)
{
r[i]=maxx>i?min(r[id-(i-id)],maxx-i):1;
while(str[i+r[i]]==str[i-r[i]]) r[i]++;
if(i+r[i]>maxx)
{
id=i;
maxx=i+r[i];
}
cnt=r[i]-1;
if(str[i] !='#') continue;
// cout<<str[i]<<" "<<cnt<<endl;
while(cnt>ans)
{
if(cnt%4==0 && r[i-cnt/2]>cnt/2)
{
ans=cnt;
break;
}
cnt-=2;
}
}
printf("%d\n",ans);
}
return 0;
}