首页 > 其他分享 >[51nod 1393] 0和1相等串 前缀和

[51nod 1393] 0和1相等串 前缀和

时间:2022-10-10 23:33:06浏览次数:132  
标签:前缀 51nod maxn ans include 1393 define

#include<cstdio>
#include<cstring>
#define maxn 1000050
#define max(a,b) ((a)>(b)?(a):(b))
using namespace std;
int l[maxn<<1];// 即maxn*2
int a[maxn];
char s[maxn];
int main(){
    scanf("%s",s+1);
    int n=strlen(s+1);
    for (int i=1;i<=n;i++)
    a[i]=a[i-1]+(s[i]=='1'?1:-1);
    for (int i=0;i<=n+n;i++)
    l[i]=-1; //初始化为-1
    l[0+n]=0;//a[0]=0  +n是因为所有数都+n以保证为非负数
    int ans=0;
    for (int i=1;i<=n;i++){
        if (l[a[i]+n]<0) l[a[i]+n]=i;//
        ans=max(ans,i-l[a[i]+n]);
    }
    printf("%d\n",ans);
}
/*
记1是+1 0是-1
然后做一次前缀和
a[i]=a[i-1]+(s[i]=='1'?1:-1)
可以发现对于一个区间[l,r]
如果满足0的个数等于1的个数
那么这段区间的和一定是0
即满足a[r]-a[l-1]=0
也就是a[r]=a[l-1]
考虑枚举 r
那么我们希望找到一个最小的l
使得a[l-1]=a[r] ->此时贡献为r-l+1

我们可以利用一个数组l[x]来记录
a[i]=x的最小i
那么枚举r时
ans=max(ans,r-l[a[r]])

考虑到a[i]可能为负数,可以考虑加上n来保证a[i]是正的
这样就可以作为数组下标了

*/

 

标签:前缀,51nod,maxn,ans,include,1393,define
From: https://www.cnblogs.com/Bunnycxk/p/16777836.html

相关文章

  • 前缀和、差分
    前缀和类似于数列,s[i]=s[i-1]+a[i],  s[r]-s[l-1]等于l到r的所有项之和  求前缀和运算:constintN=1e5+10;intsum[N],a[N];//sum[i]=a[1]+a[2]+a[3]......
  • 前缀
    Day12022.10.9昨天在菜鸟教程上学习了c++的基本语法,今日准备着手开始学习算法,在labuladong公众号上开始按顺序学习,今天首先学习了前缀和数组。前缀和首先写出前缀和代......
  • 海乐淘商城系统--01前缀(功能介绍以及关于架构)
    系统功能图我要完成的部分系统功能管理后台管理系统:管理商品、订单、类目、商品规格属性、用户管理以及内容发布等功能。前台系统:用户可以在前台系统中进行注册、登录、浏览......
  • 竞赛-6201. 找出前缀异或的原始数组
    参加竞赛的一道题中等难度给你一个长度为n的整数数组pref。找出并返回满足下述条件且长度为n的数组arr:pref[i]=arr[0]^arr[1]^...^arr[i].注意^表示......
  • 2020辽宁省赛 xor(前缀和DP 异或性质)
    2020辽宁省赛xor题意:​ 现在有一个长度为n的数组a。现在要将a拆分成若干个连续的子数组,要求每个连续的数组异或和都为x。请问有多少种拆分的方案。思路:​ 容易推出转......
  • 51Nod5440 奇怪的树
    题面我捡到了一棵树。这棵树上有n个点,被标号为1…n,其中1号结点为根节点。奇怪的是,每个点有一个体积c[i]。更奇怪的是,每个点有一个权值a[i]。更更奇怪的是,每个点......
  • [答疑精选]EA生成代码变量命名不要m前缀,采用首字母小写咋设置(2016/3/26)
    EA生成代码变量命名不要m前缀,采用首字母小写咋设置ANT:潘老师。ea里面要表示一个数组类型的属性怎么弄啊?c模板,变量命名不要m前缀,采用首字母小写咋设置潘加宇:数组已经是实现......
  • 最大子矩阵和 = 前缀和 + 最大子段和
    简单来说这道题就是求一个\(N\timesM\)的矩阵的最大子矩阵和。(因为求的是黑色石板与白色石板的数量差,所以代表白色石板的“0”可以看作-1,这样就将问题转化为了求最大......
  • LCP 最长公共前缀(一个字符串中,两个位置的后缀的最长公共前缀)
    LCP也可以用来进行一个字符串的子字符串的比较需要预处理lcp[i][j]数组,表示从i开始的后缀和从j开始的后缀的最长公共前缀lcp[i][j]可以从lcp[i+1][j+1]递推过来O(n^2)预......
  • 前缀、中缀、后缀表达式
    前缀、中缀、后缀表达式是对表达式的不同记法,其区别在于运算符相对于操作数的位置不同,前缀表达式的运算符位于操作数之前,中缀和后缀同理举例:中缀表达式:1+(2+3)×4-5......