LOJ2452

4 篇文章 0 订阅
3 篇文章 0 订阅

LOJ2452

一眼看去,有点像LOJ2427,然后。。那是想多了
好像没有什么好办法
仔细分析一下:

  • 首先显然只有偶数串才能成功
  • 而且假如 [L,R] [ L , R ] 成功了,则 [L+1,R1] [ L + 1 , R − 1 ] 一定成功

这样不就可以hash+二分枚举了吗?

#include<bits/stdc++.h>
#define gt() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1000000,stdin),p1==p2)?EOF:*p1++)
#define LL long long
#define __R 
#define isnum(ch) (ch=='0'||ch=='1')
using namespace std;
int Top;static char St[1000000],buf[1000000],*p1=buf,*p2=buf;
const int maxn=(5e5)+5,bas=233;
int n;bool a[maxn];LL L[maxn],R[maxn],Pow[maxn],Ans;
int main(){
    scanf("%d",&n);char ch=gt();
    while(!isnum(ch)) ch=gt();Pow[0]=1;
    for(__R int i=1;i<=n;i++,ch=gt()) L[i]=L[i-1]*bas+(a[i]=ch-'0'),Pow[i]=Pow[i-1]*bas;
    for(__R int i=n;i;i--) R[i]=R[i+1]*bas+(!a[i]);
    int l,r,mid;
    for(__R int i=1;i<n;i++)if(a[i]!=a[i+1]){
        l=1,r=n-i<i?n-i:i;
        while(l<=r){
            mid=l+r>>1;
            if(L[i]-L[i-mid]*Pow[mid]==R[i+1]-R[i+mid+1]*Pow[mid]) l=mid+1;else r=mid-1;
        }
        Ans+=r;
    }
    printf("%lld\n",Ans);
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值