*Manacher

来源:互联网 发布:淘宝抢购怎么看名次 编辑:程序博客网 时间:2024/06/01 08:32
今天是2017/7/8,DCDCBigBig的第二十一篇博文

额。。。最近准备期末考,有接近一个月没上博客了。。。这几天在eg集训,学了些玄妙的新算法准备NOIP提高组,就来发一下(期末考爆炸啦蛤蛤)

Manacher

哇O(n)时间求出回文字串,这个算法真是够赞的

#include<iostream>#include<cstring>#include<cstdio>#include<cmath>using namespace std;char s[100001];int manacher(char s[]){    int maxn=0,p[200001],mx=0,id=0,len=strlen(s);    char st[200001];    st[0]='$';    for(int i=0;i<len;i++){        st[i*2+1]='#';        st[(i+1)*2]=s[i];    }    st[len*2+1]='#';    for(int i=0;i<2*len;i++){        if(i<mx)p[i]=min(p[id*2-i],mx-i);        else p[i]=1;        while(st[i-p[i]]==st[i+p[i]])p[i]++;        if(i+p[i]>mx){            mx=i+p[i];            id=i;        }        maxn=max(maxn,p[i]-1);    }    return maxn;}int main(){    scanf("%s",s);    printf("%d",manacher(s));    return 0;}

原创粉丝点击