1. 程式人生 > >nefu 1316 Ela的迴文串 manacher

nefu 1316 Ela的迴文串 manacher

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;
}