1393 0和1相等串

基准时间限制:1 秒 空间限制:131072 KB 
给定一个0-1串,请找到一个尽可能长的子串,其中包含的0与1的个数相等。
Input
一个字符串,只包含01,长度不超过1000000。
Output
一行一个整数,最长的0与1的个数相等的子串的长度。
Input示例
1011
Output示例
2
思路:把0变成-1,然后01相等,那个段的和就是0,然后维护前缀和,当前缀和为0的时候,我们更新最长的,那么当当前前缀不是0的时候,如果我们知道最前面的和
等于当前值的时候(j),那么[j+1,i]的和就为0,那么当前值和最大比较更新。复杂n*log(n);
 1 #include<stdio.h>
 2 #include<algorithm>
 3 #include<iostream>
 4 #include<string.h>
 5 #include<queue>
 6 #include<math.h>
 7 #include<set>
 8 #include<vector>
 9 #include<string.h>
10 #include<map>
11 using namespace std;
12 typedef long long LL;
13 int sum[1000005];
14 map<int,int>my;
15 char str[1000005];
16 int ans[1000005];
17 int main(void)
18 {
19     my.clear();int i , j;
20     scanf("%s",str);
21     int l= strlen(str);
22     for(i = 0;i < l; i++)
23     {
24         if(str[i] == '0')
25         {
26             ans[i+1] = -1;
27         }
28         else ans[i+1] = 1;
29     }
30     my[0] = 0;int maxx = 0;
31     sum[0] = 0;
32     for(i = 1; i <= l; i++)
33     {
34         sum[i] = sum[i-1] + ans[i];
35         if(sum[i] == 0)
36         {
37             maxx = max(i,maxx);
38         }
39         else
40         {
41             if(my[sum[i]]==0)
42             {
43                 my[sum[i]] = i;
44             }
45             else maxx = max(i-my[sum[i]],maxx);
46         }
47     }
48     printf("%d\n",maxx);
49     return 0;
50 }

 


posted @ 2016-09-05 21:54  sCjTyC  阅读(434)  评论(0编辑  收藏  举报