poj 3974 manacher

来源:互联网 发布:淘宝网伴娘礼服 编辑:程序博客网 时间:2024/05/01 18:23

详细讲解


只放代码啦:

#include<algorithm>#include<iostream>#include<cstring>#include<cstdio>using namespace std;const int maxn=1100000;int len,p[maxn*2];//p最长回文半径char str[maxn],b[maxn*2]; inline void prework(void){    int i=0;    for(i=0;str[i];i++)        b[i*2+1]='#',b[(i+1)*2]=str[i];    len=i*2+1;    b[0]='$';//防止越界    b[len]=b[len+1]='#'; }inline void manacher(void){    int i,id,mx=0,ans=0;//id记录已知的回文子串中右边界最大的子串的中心位置,mx记录其右边界     for(int i=1;i<=len;i++){        p[i]=i<mx?min(mx-i,p[id*2-i]):1;        while(b[i+p[i]]==b[i-p[i]])            p[i]++;        if(p[i]+i>mx)            mx=p[i]+i,id=i;        if(ans<p[i]-1)             ans=p[i]-1;    }    cout<<ans<<endl;}signed main(void){    int cnt=0;    while(scanf("%s",str)){        if(str[0]=='E')            break;        printf("Case %d: ",++cnt);        prework();        manacher();    }    return 0;}

by >o< neighthorn

0 0
原创粉丝点击