HDU 3068 最长回文

来源:互联网 发布:js倒计时10秒代码 编辑:程序博客网 时间:2024/06/09 18:13

学了一发manachar,做个模板题
manachar的思想就是利用已有回文串辅助目前回文串
话说为什么我做完这题之后HDU就炸了

我是不是没救了,把n放在char里面还调了半天
#include<cstdio>#include<cstring>#include<algorithm>using namespace std; char t[110010], s[110010*2];int n, p[110010*2];int Manacher(){    int mx=0,id=0,re=0;    for(int i = 1; i <= n; i++)    {        if(mx>i)            p[i]=min(p[2*id-i],mx-i);        else            p[i]=1;        while(s[i+p[i]]==s[i-p[i]])p[i]++;        if(i+p[i]>mx)        {            mx=i+p[i];            id=i;        }        re=max(re,p[i]-1);    }    return re;}int main(){    while(scanf("%s",t)==1)    {        n = strlen(t)-1;        memset(s,0,sizeof(s));        s[0]='$';        s[1]='#';        for(int i = 0; i <= n; i++)        {            s[(i+1)*2+1]='#';            s[(i+1)*2]=t[i];        }        n=2*n+1;        int ans=Manacher();        printf("%d\n",ans);    }    return 0;} 
1 0