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

来源:互联网 发布:批量查询域名是否备案 编辑:程序博客网 时间:2024/05/16 18:36
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