#include<cstdio> #include<iostream> #include<map> using namespace std; map<int,int>k; int max(int x,int y){ if(x>=y){ return x; }else{ return y; } } int min(int x,int y){ if(x>=y){ return y; }return x; } int main(){ int a=0,b=0; int n; int maxn=0; cin>>n; k[0]=0; char s; for(int i=1;i<=n;i++){ cin>>s; if(s=='1'){ a++; }else{ b++; } if(k.find(a-b)==k.end()){ k[a-b]=i; }else{ maxn=max(maxn,i-k[a-b]); } } cout<<maxn<<" "<<min(a,b)*2; }
题目的大体意思就是求一个字符串的子串和子序列中1与0相等的最大值。
对于子序列还比较简单,直接开始的时候判读一个字符串中最小的是1还是0,然后乘2就可。
子串一开始我想用前缀和,但是感觉N*N的复杂度会T,所以发一次map法
这道题是Upc的一道题的简化版..