*Manacher

今天是2017/7/8,DCDCBigBig的第二十一篇博文

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

Manacher

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

#include
#include
#include
#include
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;i2+1]='#';
        st[(i+1)*2]=s[i];
    }
    st[len*2+1]='#';
    for(int i=0;i<2*len;i++){
        if(i2-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;
}

你可能感兴趣的:(算法-字符串)