POJ3974Palindrome(Manacher)

传送门

题目大意:求最长回文串

题解:Manacher

代码:

#include
#include
#include
using namespace std;

const int maxn=1e6+5;
char s[maxn*2],str[maxn*2];
int Len[maxn*2],len;

void getstr()
{
    int k=0;
    str[k++]='$';
    for(int i=0;i)
        str[k++]='#',
        str[k++]=s[i];
    str[k++]='#';
    len=k;
}

void Manacher()
{
    getstr();
    int mx=0,id;
    for(int i=1;i)
    {
        if(mx>i) Len[i]=min(Len[2*id-i],mx-i);
        else Len[i]=1;
        while(str[i+Len[i]]==str[i-Len[i]]) 
            Len[i]++;
        if(Len[i]+i>mx)
            mx=Len[i]+i,id=i;
    }
}

int main()
{
    int n,js=0;
    for(;;)
    {
        scanf("%s",&s);
       // if(s=="END") break;
        if(s[0]=='E'&&s[1]=='N'&&s[2]=='D') break;
        len=strlen(s);
        Manacher();
        int ans=1;
        for(int i=1;imax(ans,Len[i]);
        printf("Case %d: %d\n",++js,ans-1);
    }
    return 0;
}

 

你可能感兴趣的:(POJ3974Palindrome(Manacher))