这个题目意思是找到最长的w(wr)w(wr),(wr)与w是对称的,说白了就是回文串。这个题目是经典的回文串用法,感觉还是不会,,弱弱的感觉
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
#define maxn 1000005
char s[maxn];
char p[maxn];
int b[maxn];
void manacher()//这基本就是模板的运用,,不是难点
{
memset(b,0,sizeof(b));
int len=strlen(s+1);
memset(p,'\0',sizeof(p));
p[0]='$';
int cnt=1;
for(int i=1;i<=2*len+1;i++)
{
if(i%2==1)p[i]='#';
if(i%2==0)p[i]=s[cnt++];
}
int mx=0;
int id=0;
for(int i=1;i<=len*2+1;i++)
{
if(mx>i)
b[i]=min(b[2*id-i],mx-i);
else
b[i]=1;
while(p[i-b[i]]==p[i+b[i]])b[i]++;
if(b[i]+i>mx)
{
mx=b[i]+i;
id=i;
}
}
}
int solve()
{
int sum=0;
int len= strlen(s+1);
int xlen;
for(int i=1;i<=2*len+1;i+=2)
{
if(i%2==1)
{
// printf("%d %d\n",i,b[i]);
xlen=b[i]-1;
while(xlen%4!=0||xlen/2>=i)xlen--;
while(xlen>sum)
{
//printf("%d\n",xlen);
if(b[i+xlen/2]>=xlen/2+1&&b[i-xlen/2]>=xlen/2+1)//这里的操作才是需要我们多加注意,
{
sum=xlen;
break;
}
xlen-=4;
}
}
}
return sum;
}
int main()
{
int t;
//freopen("in.txt","r",stdin);
scanf("%d",&t);
while(t--)
{
scanf("%s",s+1);
manacher();
printf("%d\n",solve());
}
return 0;
}