传送门
思路: 记录每一位置的0和1的个数,算出差值,为0的话直接就是当前位置长度去和ans比较,不为0的话找到第一次出现该差值的地方相减即为可能的长度值。
#include<cstring> #include<string> #include<cstdio> #include<cstdlib> #include<iostream> #include<cmath> #include<algorithm> #include<queue> #include<vector> #include<map> #include<stack> #include<climits> #include<cctype> #include<bitset> #include<set> using namespace std; #define mod 1000000007 #define PI acos(-1.0) #define INF 0x3f3f3f3f typedef long long LL; char s[1000005]; map<int,int>m; int a[1000005]; int b[1000005]; int t; int main() { int ans=0; scanf("%s",s); int len=strlen(s); for(int i=0;i<len;i++){ a[i+1]=a[i]; b[i+1]=b[i]; if(s[i]=='0')a[i+1]++; if(s[i]=='1')b[i+1]++; t=b[i+1]-a[i+1]; if(t==0)ans=max(ans,i+1); else { if(m[t]){ ans=max(ans,i+1-m[t]); } else { m[t]=i+1; } } } cout<<ans<<endl; return 0; }