51nod 1393 0和1相等串(鸽巢原理)

基准时间限制: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;
}


 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

叶孤心丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值