【bzoj2084】 POI2010 Antisymmetry manacher

来源:互联网 发布:shell 遍历数组 编辑:程序博客网 时间:2024/05/08 08:08

挺水的一道题,manacher匹配的时候改一下匹配条件就可以了,只要两个数相加等于一时就可以,结果WA了三次,一定要注意是不存在奇数串的,而且统计的时候要用long long,还有一次是忘了除以二。。。

还是太弱了


#include<cstdio>#include<cstring>#include<cstdlib>#include<cmath>#include<iostream>#include<algorithm>#define maxn 1000010using namespace std;char s[maxn],a[2*maxn];int p[2*maxn];int n,m;long long ans;void manacher(){m=2*n+1;for (int i=1;i<=n;i++){a[i*2]=s[i];a[i*2+1]='#';}a[0]='+';a[1]='#';a[m+1]='-';int mx=0,id=0;for (int i=1;i<=m;i+=2){if (mx>i) p[i]=min(p[2*id-i],mx-i);else p[i]=1;while (a[i+p[i]]-'0'+a[i-p[i]]-'0'==1 || (a[i+p[i]]==a[i-p[i]] && a[i+p[i]]=='#')) p[i]++;if (i+p[i]>mx) mx=i+p[i],id=i;}}int main(){scanf("%d",&n);scanf("%s",s+1);manacher();for (int i=1;i<=m;i+=2) ans+=(p[i]-1)/2;printf("%lld\n",ans);return 0;}


0 0
原创粉丝点击