题意:给你一个01字符串,问最长的字串和子序列,字串和子序列都要满足0和1的个数相等。
题解:签到,用map记录更方便。
简单附代码:
#include <iostream>
#include <map>
using namespace std;
#define int long long
#define fir first
#define sec second
const int maxn=3e5+5;
char str[maxn];
int sum[maxn];
signed main(){
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
map<int,int>mp;
int n;cin>>n;
cin>>str+1;
int o=0,z=0,res=0;
mp[0]=0;
for(int i=1;i<=n;i++){
if(str[i]=='1'){o++;sum[i]=sum[i-1]+1;}
else{z++;sum[i]=sum[i-1]-1;}
if(mp.find(sum[i])!=mp.end())res=max(res,i-mp[sum[i]]);
else mp[sum[i]]=i;
}
cout<<res<<" "<<min(z,o)*(int)2<<endl;
return 0;
}