马拉车算法,最长回文子串——HDU3068

题目链接

马拉车模板题

题目代码

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<vector>
using namespace std;
typedef long long LL;
const int maxn=110007;
char str[maxn],res[maxn*2];
int p[maxn*2];
int Manacher(char *s){
    int len=strlen(s);
    int maxlen=0;
    int right=0,mid=0;
    for(int i=0;i<len;i++){
        res[i*2+2]=str[i];
        res[i*2+3]='#';
    }
    res[0]='$',res[1]='#';
    for(int i=1;i<len*2+2;i++){
        p[i]=right>i?min(right-i,p[mid*2-i]):1;
        while(res[i+p[i]]==res[i-p[i]])
            p[i]++;
        if(i+p[i]>right){
            right=i+p[i];
            mid=i;
        }
        if(p[i]>maxlen){
            maxlen=p[i];
        }
    }return maxlen-1;
}
int main(){
    while(~scanf("%s",str)){
        printf("%d\n",Manacher(str));
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/helman/p/11309341.html