HDU 3068 Manacher 模版题

来源:互联网 发布:用淘宝联盟被发现了 编辑:程序博客网 时间:2024/06/06 03:07

点击打开链接

题意:求最长回文子串

思路:Manacher 算法水过,推荐这位大牛的证明证明

#include <stdio.h>#include <string.h>#include <stdlib.h>#include <iostream>#include <algorithm>using namespace std;typedef long long ll;const int inf=0x3f3f3f3f;const int maxn=110010;char str[maxn],tmp[maxn<<1];int len1[maxn<<1];int init(char *st){    int len=strlen(st);    tmp[0]='@';    for(int i=1;i<=2*len;i+=2){        tmp[i]='#';        tmp[i+1]=st[i/2];    }    tmp[2*len+1]='#';    tmp[2*len+2]='$';    tmp[2*len+3]=0;    return 2*len+1;}int Manacher(char *st,int len){    int p=0,ans=0,po=0;    for(int i=1;i<=len;i++){        if(p>i) len1[i]=min(p-i,len1[2*po-i]);        else len1[i]=1;        while(st[i-len1[i]]==st[i+len1[i]]) len1[i]++;        if(len1[i]+i>p){            p=len1[i]+i;            po=i;        }        ans=max(ans,len1[i]);    }    return ans-1;}int main(){    while(scanf("%s",str)!=-1){        init(str);        int len=init(str);        int ans=Manacher(tmp,len);        printf("%d\n",ans);    }    return 0;}

0 0
原创粉丝点击