A Gragh Games
Unsolved.
B Crazy Binary String
题解:水题,子序列只要统计0和1数量,取最小值然后乘2就是答案;
对于子串:先记录0和1 前缀和的差值,然后找差值相等的距离最远的两个位置即可;
参考代码:
#include<bits/stdc++.h> #define maxl 100010 using namespace std; int n; int cnt[2]; int num[maxl*2]; int sum[maxl][2]; char s[maxl]; int ans1,ans2; inline void prework() { scanf("%s",s+1); cnt[0]=cnt[1]=0; for(int i=1;i<=n;i++) { cnt[s[i]-'0']++; if(s[i]=='0') { sum[i][0]=sum[i-1][0]+1; sum[i][1]=sum[i-1][1]; } else { sum[i][0]=sum[i-1][0]; sum[i][1]=sum[i-1][1]+1; } } } inline void mainwork() { for(int i=1;i<2*maxl;i++) num[i]=-1; num[maxl]=0; ans1=0;ans2=min(cnt[0],cnt[1])*2; for(int i=1;i<=n;i++) { int d=sum[i][1]-sum[i][0]+maxl; if(num[d]>=0) ans1=max(i-num[d],ans1); else num[d]=i; } } inline void print() { printf("%d %d\n",ans1,ans2); } int main() { int t; while(~scanf("%d",&n)) { prework(); mainwork(); print(); } return 0; }