Manacher算法--O(n)回文子串算法

详细了解请看以下链接:

https://blog.csdn.net/ggggiqnypgjg/article/details/6645824

https://blog.csdn.net/xingyeyongheng/article/details/9310555

Problem Description

给出一个只由小写英文字符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的字符串中所包含的最长回文长度.

 

 

Sample Input

 

aaaa abab

 

 

Sample Output

 

4 3

 

AC代码:

#include
using namespace std;

const int maxn=2e5+10;

char a[maxn],b[maxn];
int p[maxn];

int main(){
    while(~scanf("%s",b+1)){
        int n,m,cnt=1,mxx=1,id=1,ans=0;
        m=strlen(b+1);
        for(int i=1;i<=m;i++){
            a[cnt]='#';
            cnt++;
            a[cnt]=b[i];
            cnt++;
        }
        for(int i=1;i<=cnt;i++){
            if(mxx<=i) p[i]=1;
            else p[i]=min(p[id*2-i],mxx-i);
            while(a[i+p[i]]==a[i-p[i]])
                p[i]++;
            if(i+p[i]>mxx){
                mxx=i+p[i];
                id=i;
            }
            if(p[i]>ans){
                if(i&1) ans=p[i]/2*2;
                else ans=(p[i]-1)/2*2+1;
            }
        }
        printf("%d\n",ans);
    }
    return 0;

你可能感兴趣的:(算法)