51nod 1393:0和1相等串
2024-08-31 19:28:46
基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题
收藏
关注
给定一个0-1串,请找到一个尽可能长的子串,其中包含的0与1的个数相等。
Input
一个字符串,只包含01,长度不超过1000000。
Output
一行一个整数,最长的0与1的个数相等的子串的长度。
Input示例
1011
Output示例
2
记录每一个字符时所含有的1个个数与0的个数,一个字串包含的0和1的个数相等,就是首尾处1的个数与0的个数的差值相等。所以对于每一个字符,看之前这个差值有没有相同的,有相同的就取看能否够得着最大值。没有则标记一下。O(n)。
代码:
#include <iostream>
#include <algorithm>
#include <cmath>
#include <vector>
#include <string>
#include <cstring>
#pragma warning(disable:4996)
using namespace std; int sum0[1000000];
int sum1[1000000];
int diff[1000000]; int main()
{
memset(diff, -1, sizeof(diff));
string test;
cin >> test; int i, max_v = 0;
int len = test.length(); sum0[0] = 0;
sum1[0] = 0; if (test[0] == '0')
{
sum0[i] = 1;
sum1[i] = 0;
}
else
{
sum1[i] = 1;
sum0[i] = 0;
} for (i = 1; i < len; i++)
{
if (test[i] == '0')
{
sum0[i] = sum0[i - 1] + 1;
sum1[i] = sum1[i - 1];
}
else
{
sum1[i] = sum1[i - 1] + 1;
sum0[i] = sum0[i - 1];
}
if (diff[sum1[i] - sum0[i] + 500000] == -1)
{
diff[sum1[i] - sum0[i] + 500000] = i;
}
else
{
max_v = max(max_v, i - diff[sum1[i] - sum0[i] + 500000]);
}
if (sum1[i] == sum0[i])
{
max_v = max(max_v, i + 1);
}
}
cout << max_v << endl; return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
最新文章
- Swift-UIButton
- CI-持续集成(1)-软件工业“流水线”概述
- iPhone Push消息全攻略.1
- maven工程-eclipse红叹号
- scala 入门(2)--数组相关操作
- Android中的菜单
- 辛星跟您玩转vim第一节之vim的下载与三种模式
- Scheme N皇后
- 如何解决Mac无法读取外置硬盘问题?
- SLAM+语音机器人DIY系列:(八)高阶拓展——1.miiboo机器人安卓手机APP开发
- springboot 学习之路 4(日志输出)
- oracle随机数(转)
- Linux 磁盘使用查看 查看使用磁盘程序 Monitoring disk activity in linux
- 一些做vue前端的经验
- 安装最新nginx
- 【Android】Android实现Handler异步详解
- 新概念 Lesson 3 Nice to meet you
- Openwrt VLAN Configure(2)
- R语言爬虫:使用R语言爬取豆瓣电影数据
- 深入理解JAVA I/O系列四:RandomAccessFile