POJ 3974 Palindrome Manacher

来源:互联网 发布:薛之谦女装店淘宝店 编辑:程序博客网 时间:2024/04/29 03:13
#include<iostream>#include<queue>#include<algorithm>#include<stdlib.h>#include<stdio.h>#include<string.h>using namespace std;const int MAX=1111111<<1;char Str[MAX],Ch;int Len;int Radius[MAX];void Manacher(){    Radius[0]=1;    for (int i=1,k=0;i<Len;i++)    {        if (k+Radius[k]-1<i) Radius[i]=1;        else Radius[i]=min(Radius[2*k-i],k+Radius[k]-i);        while (Str[i-Radius[i]]==Str[i+Radius[i]]) Radius[i]++;        if (k+Radius[k]-1<i+Radius[i]-1) k=i;    }}int main(){    int Cases=0;    while (scanf("%s",Str)!=EOF)    {        if (Str[0]=='E'&&Str[1]=='N'&&Str[2]=='D'&&Str[3]=='\0')            break;        Len=strlen(Str);        for (int i=Len;i>=0;i--)        {            Str[i*2+1]='#';            Str[i*2+2]=Str[i];        }        Len=Len*2+2;        Str[0]='*',Str[Len]='\0';        Manacher();        printf("Case %d: %d\n",++Cases,(*max_element(Radius,Radius+Len))-1);    }    return 0;}
0 0
原创粉丝点击