hdu3068 Manacher模板

来源:互联网 发布:机顶盒刷linux 编辑:程序博客网 时间:2024/05/22 08:14
#include <iostream>#include <cstdio>#include <string>#include <cstring>#include <fstream>#include <algorithm>#include <cmath>#include <queue>#include <stack>#include <vector>#include <map>#include <set>#include <iomanip>using namespace std;//#pragma comment(linker, "/STACK:102400000,102400000")#define maxn 200005#define MOD 1000000007#define mem(a , b) memset(a , b , sizeof(a))#define LL long long#define ULL long longconst long long INF=0x3fffffff;#define N 110010char s[N*2],str[N*2];int n,p[N*2];void fun(){    int len=(int)strlen(s);    str[0]='$';str[1]='#';    n=2;    for(int i=0;i<len;i++)    {        str[n++]=s[i];        str[n++]='#';    }    str[n]='\0';}void Manacher(){    int i,id,mx=0;    for(i=1;i<n;i++)    {        if(mx > i)            p[i]=min(p[2*id-i],p[id]+id-i);        else            p[i]=1;        for(;str[i+p[i]] == str[i-p[i]];p[i]++)            ;        if(p[i]+i > mx)        {            mx=p[i]+i;            id=i;        }    }}void work(){    int ans=-1;    for(int i=1;i<n;i++)        ans=max(ans,p[i]);    printf("%d\n",ans-1);}int main(){    while(scanf("%s",s)!=EOF)    {        fun();        Manacher();        work();    }    return 0;}

0 0
原创粉丝点击