最长回文字串Manacher 算法

来源:互联网 发布:广州多迪网络要交钱吗 编辑:程序博客网 时间:2024/05/17 15:03
#include <bits/stdc++.h>using namespace std;typedef long long ll;const int maxn=1e6+5;char s[maxn*2],str[maxn];int a[maxn*2];int main(){    int t,n,i,maxst,maxrd,ans;    scanf("%d",&t);    while(t--&&scanf("%s",str+1)!=EOF)    {        ans=maxst=maxrd=1;        for(i=n=1;str[i];i++)        {            s[n++]='#';            s[n++]=str[i];        }        s[n]='#';        for(i=0;i<=n;i++)        {            if(i<maxrd)                a[i]=min(maxrd-i+1,a[maxst*2-i]);            else                a[i]=1;            while(s[i-a[i]]==s[i+a[i]])                a[i]++;            if(a[i]+i-1>maxrd)            {                maxst=i;                maxrd=a[i]+i-1;            }            ans=max(ans,a[i]-1);        }        printf("%d\n",ans);    }    return 0;}