博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[题解]Crazy Binary String-前缀和(2019牛客多校第三场B题)
阅读量:5025 次
发布时间:2019-06-12

本文共 1079 字,大约阅读时间需要 3 分钟。

题目链接:

 


 

题意:

给你一段长度为n,且只有 ‘0’ 和 ‘1’ 组成的字符串 a[0,...,n-1]。求子串中 ‘0’ 和 ‘1’ 数目相等的最大长度,子序列中 ‘0’ 和 ‘1’ 数目相等的最大长度。

 

思路:

子序列的最大长度很容易想到,就是 ‘0’ 和 ‘1’ 的数量中最小的两倍

求子串的最大长度就用前缀和

将 ‘1’ 的价值设为1,‘0’ 的价值设为-1,用数组 cnt[i] 记录从 0 到 i 的前缀和,再用数组 pos[i] 记录前缀和为 i 时的位置

可知当 cnt[j] = cnt[i] (j > i)时,子串 a[i+1,....,j] 中的 ‘0’ 和 ‘1’ 数量相等,则更新 ans=max(ans,j-pos[cnt[j]])

当时想了好久,才明白要用前缀和来求子串的最大长度,自己太菜qaq

 

1 #include 
2 using namespace std; 3 typedef long long ll; 4 int pos[200006],cnt[200006]; 5 int main() 6 { 7 int n,m,t,x=0,y=0,ans1=0,ans2; 8 cin>>n; 9 string a;10 cin>>a;11 cnt[0]=100000;//设初始价值为100000,否则可能出现负数,数组越界 12 for(int i=1;i<=n;i++){13 if(a[i-1]=='0')14 cnt[i]=cnt[i-1]-1,x++;15 else16 cnt[i]=cnt[i-1]+1,y++;17 if(pos[cnt[i]]==0&&cnt[i]!=100000)//更新pos 18 pos[cnt[i]]=i;19 else20 ans1=max(ans1,i-pos[cnt[i]]);//如果pos[cnt[i]]不为0,则可得到一段符合要求的字串 21 }22 ans2=min(x,y)*2;23 cout<
<<" "<
<

 

转载于:https://www.cnblogs.com/Yanick/p/11245058.html

你可能感兴趣的文章
【Foreign】最大割 [线性基]
查看>>
根据图中的盲点坐标,弹出div层
查看>>
典型用户与场景总结
查看>>
用Eclipse在整个工程中搜索关键词
查看>>
[转]linux shell 多线程实现
查看>>
App测试的策略
查看>>
css 子div自适应父div高度
查看>>
高性能开发规范
查看>>
React Native & Android & iOS
查看>>
POJ3621 Sightseeing Cows 最优比率环 二分法
查看>>
HDU1565 方格取数(1) —— 状压DP or 插头DP(轮廓线更新) or 二分图点带权最大独立集(最小割最大流)...
查看>>
2d空间直线拟合as3源码和flash示例
查看>>
降维与度量学习——机器学习(周志华)
查看>>
Tomcat安装目录下各个文件的用途
查看>>
如何高效的查询数组中是否包含某个值
查看>>
PYTHON_with_as
查看>>
变量、数据类型及基本操作
查看>>
ICP、MRR、BKA优化
查看>>
JavaScript之将JS代码放在什么位置最合适
查看>>
命名空间与程序集的区别【转】
查看>>