您的位置:首页 > 其它

[bzoj2084][POI2010]ANT-Antisymmetry(二分+hash)

2017-10-18 18:48 381 查看

题目:

我是超链接

题解:

这种二分题目主要考虑单调性,O(nlogn) 还是资瓷的

我们可以枚举对称的中心,然后二分长度加到一起,如果小的都不能对称,那更大的肯定不能对称

代码:

#include <cstdio>
#include <iostream>
#include <cstring>
#define ull unsigned long long
using namespace std;
const int N=5e5;
const int p=1300000001ull;
char st[N+5];
ull H1[N+
4000
5],H2[N+5],mi[N+5];
bool check(int l,int r,int mid)
{
ull x=H1[r]-H1[l-1]*mi[r-l+1];
ull y=H2[l]-H2[r+1]*mi[r-l+1];
if (x==y) return 1;else return 0;
}
int main()
{
int n,i,ans=0;
scanf("%d",&n);scanf("%s",st+1);
mi[0]=1;
for (i=1;i<=n;i++) mi[i]=mi[i-1]*p;
for (i=1;i<=n;i++)
H1[i]=H1[i-1]*p+st[i]-'0';
for (i=n;i>=1;i--)
H2[i]=H2[i+1]*p+(!(st[i]-'0'));
for (i=1;i<=n;i++)
{
int l=1,r=min(i,n-i),cnt=0;
while (l<=r)
{
int mid=(l+r)>>1;
if (check(i-mid+1,i+mid,mid)) cnt=mid,l=mid+1;
else r=mid-1;
}
ans+=cnt;
}
printf("%d",ans);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: