POJ3974Palindrome(Manacher)

传送门

题目大意:求最长回文串

题解:Manacher

代码:

#include<cstdio>
#include<cstring>
#include<iostream>
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<len;i++)
        str[k++]='#',
        str[k++]=s[i];
    str[k++]='#';
    len=k;
}

void Manacher()
{
    getstr();
    int mx=0,id;
    for(int i=1;i<len;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;i<len;i++) ans=max(ans,Len[i]);
        printf("Case %d: %d\n",++js,ans-1);
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/zzyh/p/12005436.html
今日推荐