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;
}
View Code

相关文章:

  • 2021-09-10
  • 2022-02-19
  • 2022-02-24
  • 2021-07-31
  • 2021-06-14
  • 2022-12-23
猜你喜欢
  • 2021-06-01
  • 2022-12-23
  • 2022-12-23
  • 2022-01-21
  • 2021-07-26
相关资源
相似解决方案