参考资料:
[1]:官方题解(提取码:rkcq)
[2]:标程(提取码:0tiq)
B.Crazy Binary String(前缀和)
•题意
给你一个只包含 0,1 的串 s;
求满足 0 与 1 的个数相同的子串和子序列;
输出这两个串的最大长度;
•题解
求解满足条件的最大子串长度类似于这道题:????
而最大子序列就是 2×min(0的个数,1的个数);
•Code
View Code1 #include<bits/stdc++.h> 2 using namespace std; 3 #define GCD(a,b) __gcd(a,b) 4 #define ll long long 5 const int maxn=1e5+50; 6 7 int n; 8 char s[maxn]; 9 int a[maxn]; 10 int b[maxn]; 11 map<int ,int >f; 12 13 void Solve() 14 { 15 f.clear(); 16 a[0]=b[0]=0; 17 f[0]=0; 18 19 int zero=0; 20 int one=0; 21 int len=strlen(s+1); 22 for(int i=1;i <= len;i++) 23 { 24 if(s[i] == '1') 25 one++; 26 else 27 zero++; 28 a[i]=a[i-1]+(s[i] == '1'); 29 b[i]=b[i-1]+(s[i] == '0'); 30 } 31 32 int ans=0; 33 for(int i=1;i <= len;++i) 34 { 35 int cur=a[i]-b[i]; 36 if(f.count(cur)) 37 ans=max(ans,i-f[cur]); 38 else 39 f[cur]=i; 40 } 41 printf("%d %d\n",ans,min(one,zero)*2); 42 } 43 int main() 44 { 45 scanf("%d",&n); 46 scanf("%s",s+1); 47 Solve(); 48 49 return 0; 50 }