题目链接:https://ac.nowcoder.com/acm/contest/883/B


题意:

给你一段长度为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

 #include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int pos[],cnt[];
int main()
{
int n,m,t,x=,y=,ans1=,ans2;
cin>>n;
string a;
cin>>a;
cnt[]=;//设初始价值为100000,否则可能出现负数,数组越界
for(int i=;i<=n;i++){
if(a[i-]=='')
cnt[i]=cnt[i-]-,x++;
else
cnt[i]=cnt[i-]+,y++;
if(pos[cnt[i]]==&&cnt[i]!=)//更新pos
pos[cnt[i]]=i;
else
ans1=max(ans1,i-pos[cnt[i]]);//如果pos[cnt[i]]不为0,则可得到一段符合要求的字串
}
ans2=min(x,y)*;
cout<<ans1<<" "<<ans2<<endl;
return ;
}

最新文章

  1. [译]ZOOKEEPER RECIPES-Queues
  2. [bzoj3932][CQOI2015][任务查询系统] (主席树)
  3. chrome地址栏搜索直接跳转百度首页?
  4. Pyunit测试框架
  5. Delphi中对BCD码的直接支持 (转)
  6. [VBS]带参数删除扩展名不是*.h、*.c、*.cpp的全部文件
  7. BZOJ4010: [HNOI2015]菜肴制作
  8. emacs学习
  9. SQL Server 基础:拾遗
  10. Web service是什么?(转)
  11. jQuery选择器总结 转
  12. 两种方法操作其它mac应用的窗口
  13. 嵌套调用less函数时参数值的变化及提取部分-遁地龙卷风
  14. Centos 7 配置邮件发送
  15. Java学习笔记之——final关键字
  16. 【java】static的应用场景
  17. 百度谷歌雅虎三大搜索引擎比较和如何配置谷歌访问助手访问Google搜索服务
  18. c++运算符重载---20
  19. Linux+Redis实战教程_day02_2、redis简述及安装与启动
  20. spring配置数据库连接池druid

热门文章

  1. Linux删除自带的openjdk,安装jdk1.8
  2. uploadify多图片和文件上传网站应用
  3. Oracle ORA-01033: ORACLE initialization or shutdown in progress 错误解决办法. 重启服务
  4. Task总结
  5. Panabit的各种配置文件
  6. JVM(9)之 年轻代收集器
  7. 1. ZooKeeper简介
  8. spring(六):spring中AOP的基本使用
  9. 奇异值分解基础(SVD)
  10. Ajax ——数据解析