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

来源:互联网 发布:uniprot数据库怎么使用 编辑:程序博客网 时间:2024/05/20 02:27

题目:

我是超链接

题解:

这种二分题目主要考虑单调性,O(nlogn) 还是资瓷的
我们可以枚举对称的中心,然后二分长度加到一起,如果小的都不能对称,那更大的肯定不能对称

代码:

#include <cstdio>#include <iostream>#include <cstring>#define ull unsigned long longusing namespace std;const int N=5e5;const int p=1300000001ull;char st[N+5];ull H1[N+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);}
原创粉丝点击