给定一个0-1串,请找到一个尽可能长的子串,其中包含的0与1的个数相等。
Input
一个字符串,只包含01,长度不超过1000000。
Output
一行一个整数,最长的0与1的个数相等的子串的长度。
Input示例
1011
Output示例
2
记录每个点当前0 和 1出现的次数的差值,当任意两个点的差值相同时,则说明这两点中间出现的0和1个数相等
#include <iostream> #include <fstream> #include <vector> #include <algorithm> #include <cmath> #include <cstring> #include <stdlib.h> #include <cstdio> #define N 1000001 #define inf 0x3f3f3f3f using namespace std; char a[N]; int b[N]; int num[2*N+1]; int main() { while(~scanf("%s",a)) { memset(num,inf,sizeof(num)); int len = strlen(a); /* bool flag =true; //特判全是0或全是1的情况 ,没有这一步初始化ans要为0 for(int i=1; i<len; i++) { if(a[i]!=a[i-1]) { flag = false; break; } } if(flag) { printf("0\n"); continue; }*/ int sum[2] = {0}; //记录0和1的个数 num[N]=0; //记录sum[1] - sum[0]的差 int ans = 0; for(int i = 0; i < len; i++) { sum[int(a[i]-'0')] += 1; b[i] = sum[1] - sum[0]; if(num[b[i]+N] == inf) // +N 防止下标出现负数 { num[b[i]+N] = i; } else { ans = max(ans, i - num[b[i] + N]); } } if(ans%2) //如果最长串从第一个开始,会出现奇数如10010 printf("%d\n",ans+1); else printf("%d\n",ans); } return 0; }