基准时间限制:1 秒 空间限制:131072 KB 分值: 20
难度:3级算法题
给定一个0-1串,请找到一个尽可能长的子串,其中包含的0与1的个数相等。
Input
一个字符串,只包含01,长度不超过1000000。
Output
一行一个整数,最长的0与1的个数相等的子串的长度。
Input示例
1011
Output示例
2
鸽巢原理:桌上有十个苹果,要把这十个苹果放到九个抽屉里,无论怎样放,我们会发现至少会有一个抽屉里面至少放两个苹果。这一现象就是我们所说的“抽屉原理”。 抽屉原理的一般含义为:“如果每个抽屉代表一个集合,每一个苹果就可以代表一个元素,假如有n+1个元素放到n个集合中去,其中必定有一个集合里至少有两个元素。” 抽屉原理有时也被称为鸽巢原理。它是组合数学中一个重要的原理。
思路:转换到这个题上就可以这样理解,当0和1的差值与上一个0和1的差值相同时,那么他们之间的字符串中0和1的数目是相同的。求出最大的就行了。
</pre><pre name="code" class="cpp"><pre name="code" class="cpp">#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
using namespace std;
char str[1000100];
struct node{
int x;
int y;
int xans;
int yans;
}q[1000100];
int main(){
//freopen("3308_1.txt","r",stdin);
//freopen("3308_2.out","w",stdout);
while(scanf("%s",str+1)!=EOF){
int l = 0,r = 0;
int len = strlen(str+1);
for(int i=0;i<=len+10;i++){
q[i].x = 0;
q[i].y = 0;
q[i].xans = 0;
q[i].yans = 0;
}
int maxx = 0;
for(int i=1;str[i]!='\0';i++){
if(str[i] == '0'){
l++;
}else{
r++;
}
if(l>r){
if(q[l-r].x == 0){
q[l-r].x = i;
}else{
q[l-r].xans = i-q[l-r].x;
if(maxx<q[l-r].xans){
maxx = q[l-r].xans;
}
}
}else if(r>l){
if(q[r-l].y == 0){
q[r-l].y = i;
}else{
q[r-l].yans = i-q[r-l].y;
if(maxx<q[r-l].yans){
maxx = q[r-l].yans;
}
}
}else{
if(maxx < i){
maxx = i;
}
}
}
printf("%d\n",maxx);
}
return 0;
}