【BZOJ 2084】[Poi2010]Antisymmetry manacher

来源:互联网 发布:斯托克斯矩阵 编辑:程序博客网 时间:2024/04/30 03:17

其实就是找回文字串,但是需要注意的是,回问字串的长度必须是偶数。

令1为2,0还是0,中间插入的字符是1,这样的话就可以很方便的判断,只用两边相加位就认定为相等。

#include<cstdio>#include<cstring>#include<iostream>#define maxn 1000020 using namespace std;int n,p[maxn],a[maxn];char s[maxn];int main(){scanf("%d%s",&n,s+1);a[1]=1;for(int i=1;i<=n;i++)a[i<<1]= s[i]=='1' ? 2 : 0,a[(i<<1)-1]=1;a[0]=127,a[n<<1|1]=1;n=n<<1|1;for(int id,mx=0,i=1;i<=n;i+=2){if(mx>=i)p[i]=min(mx-i,p[2*id-i]);else p[i]=0;while(a[i+p[i]+1]+a[i-p[i]-1]==2&&i+p[i]<n&&i-p[i]>1)p[i]++;if(p[i]+i>mx)mx=p[i]+i,id=i;}int ans=0;for(int i=1;i<=n;i+=2)ans+=p[i]>>1;printf("%d",ans);return 0;}


0 0
原创粉丝点击