[BZOJ2342][Shoi2011]双倍回文(manacher)

来源:互联网 发布:淘宝旺旺头像 编辑:程序博客网 时间:2024/06/05 19:23

题目描述

传送门

题解

这道题非常有趣的是,要将一个字符串劈开两次都是回文串。
实际上manacher了之后对于每一个大中心暴力找小中心就可以了,因为只有26个字符暴力是无法卡掉的。不过如果时间复杂度科学的话貌似可以写平衡树或者可持久化线段树之类的东西。

代码

#include<iostream>#include<cstring>#include<cstdio>using namespace std;#define N 1000005int la,n,mx,id,l,r,loc,ans,ansi;char s[N],a[N];int p[N];int main(){    scanf("%d\n",&la);gets(a);s[0]='*';    for (int i=0;i<la;++i)        s[++n]='#',s[++n]=a[i];    for (int i=1;i<=n;++i)    {        if (mx>i) p[i]=min(p[2*id-i],mx-i);        else p[i]=1;        while (s[i-p[i]]==s[i+p[i]]) ++p[i];        if (i+p[i]>mx)        {            mx=i+p[i];            id=i;        }    }    for (int i=1;i<=n;i+=2)    {           l=(i-p[i]+1+i)/2;if (l%2==0) ++l;        while (l<=i&&l+p[l]<i) l+=2;        ans=max(ans,((i-l)/2)*4);    }    printf("%d\n",ans);}
0 0
原创粉丝点击