首页 > 代码库 > HDU3068 最长回文

HDU3068 最长回文

给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度.
回文就是正反读都是一样的字符串,如aba, abba等
 

 

Input
输入有多组case,不超过120组,每组输入为一行小写英文字符a,b,c...y,z组成的字符串S
两组case之间由空行隔开(该空行不用处理)
字符串长度len <= 110000
 

 

Output
每一行一个整数x,对应一组case,表示该组case的字符串中所包含的最长回文长度.
题解:
马拉车板子题,如果不会请参考ACM等书籍。
代码:
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<algorithm>
#include<cstring>
using namespace std;
char x[110010];
char xx[1100010];
int k=0,len[1100010],ans;

void cl(){
    memset(len,0,sizeof(len));
    k=0;
    ans=0;
}

void build(char x[]){
    int len1=strlen(x);
    xx[0]=‘$‘;
    for(int i=0;i<len1;i++) 
    xx[++k]=‘#‘,xx[++k]=x[i];
    xx[++k]=‘#‘;
}

void manacher(){
    int ans=0,id,ma=0;
    for(int i=1;i<=k;i++){
        if(ma>i) len[i]=min(ma-i,len[id*2-i]);
        else len[i]=1;
        while(xx[i+len[i]]==xx[i-len[i]]) len[i]++;
        if(ma<i+len[i]) id=i,ma=len[i]+i;
    }
}

int main(){
    while(scanf("%s",&x)!=EOF){
        cl();
        build(x);
        manacher();
        for(int i=1;i<=k;i++) ans=max(ans,len[i]-1);
        printf("%d\n",ans);
    }
}

HDU3068 最长回文