DT2131
我用的方法是在计算p数组的值,判断是否构成回文时看那个字符是否是ELA喜欢的字符。比如BAOAB以O为中心时判断到B时就不++,这样计算结果是对的。
但是以不喜欢的字符为 中心的情况还没排除。这种只要在遍历p数组求MAX值时不考虑他即可。
#include <iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=223000;
int n,p[maxn];
char s[maxn],str[maxn];
int judge(int i)
{
if(str[i]=='A'||str[i]=='H'||str[i]=='I'||str[i]=='M'||str[i]=='O'||str[i]=='T'||str[i]=='U'||str[i]=='V'||str[i]=='W'||
str[i]=='X'||str[i]=='Y'||str[i]=='#')return 1;
else return 0;
}
void kp()
{
int i,mx=0;
int id=0;
for(i=1;i<n;i++)
{
if(mx>i)p[i]=min(p[2*id-i],mx-i);
else p[i]=1;
while(str[i+p[i]]==str[i-p[i]]&&judge(i-p[i]))
p[i]++;
if(p[i]+i>mx)
{
mx=p[i]+i;
id=i;
}
}
}
void init()
{
int i,k=1;
str[0]='$';
for(int i=0;i<=n;i++)
{
str[k++]='#';
str[k++]=s[i];
}
str[k++]='#';
n=k;
}
int main()
{
int t;
cin>>t;
while(t--)
{
scanf("%s",s);
n=strlen(s);
memset(p,0,sizeof(p));
init();
kp();
int max=-999;
for(int i=0;i<n;i++)
{
//printf("%d ",p[i]);
if(p[i]>max&&judge(i))max=p[i];
}
if(max>0)printf("%d\n",max-1);
else printf("0\n");
}
return 0;
}