hdu3068(Manacher)

来源:互联网 发布:gta5捏脸数据男周星驰 编辑:程序博客网 时间:2024/05/29 18:19

链接:点击打开链接

题意:求最长回文子串

代码:

#include <queue>#include <vector>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <iostream>#include <algorithm>using namespace std;const int siz=110005;int n,rl[siz<<1];char s[siz],str[siz<<1];int manacher(){    int i,ma,ans,pos;    ma=ans=pos=0;    for(i=0;i<n;i++){        if(i<ma)        rl[i]=min(ma-i,rl[2*pos-i]);        else        rl[i]=1;        while(str[i-rl[i]]==str[i+r l[i]]){            if((i-rl[i]<0)||(i+rl[i]>=n))            break;            rl[i]++;        }        if(i+rl[i]>ma){            ma=i+rl[i];            pos=i;        }        ans=max(ans,rl[i]);    }    return ans-1;}int main(){                                     //manacher模板题,网上好多讲解    int i,j;    while(scanf("%s",s)!=EOF){        n=0;        str[n++]='#';        for(i=0;s[i];i++)        str[n++]=s[i],str[n++]='#';        printf("%d\n",manacher());    }    return 0;}

原创粉丝点击