zoukankan      html  css  js  c++  java
  • 2020牛客寒假算法基础集训营1 nozomi和字符串

    https://ac.nowcoder.com/acm/contest/3002/H

    题意

      对于一个 01” 串而言,每次操作可以把 0 字符改为 1 字符,或者把 1 字符改为 0 字符。所谓 01” 串,即只含字符 0 和字符 1 的字符串。
      最多有  次操作的机会。在操作之后找出一个尽可能长的连续子串,这个子串上的所有字符都相同。这个子串的长度最大值是多少?
      注: 次操作机会可以不全部用完。

    题解

      显然操作要不就是把尽可能多的 1 变成 0 ,要不就是把尽可能多的 0 变成 1 。取这两种情况的最优值即可。

           对于 0 变 1 的情况,可以统计每个 1 的连续前缀 1 的位置和连续后缀 1 的位置。然后进行枚举,即连续变化 k 个 0 ,最后通过连续后缀 1 的位置和连续前缀 1 的位置得出答案。

      对于 1 变0 的情况,同理。

    代码

      v0记录着每个字符 0 的下标,更重要的是,v0也意味着每个 1 的连续前缀位置和连续后缀位置。

      v1记录着每个字符 1 的下标,更重要的是,v1也意味着每个 0 的连续前缀位置和连续后缀位置。

    #include<bits/stdc++.h>
    using namespace std;
    string s;
    vector<int>v0,v1;
    int main()
    {
       int i,n,j,k,ans=-1;
       scanf("%d%d",&n,&k);
       cin>>s;
    
       v0.push_back(-1);
       v1.push_back(-1);
       for(i=0;i<s.size();i++)
       {
          if(s[i]=='0') v0.push_back(i);
          else v1.push_back(i);
       }
       v0.push_back(n);
       v1.push_back(n);
    
       if(v0.size()<=k||v1.size()<=k)  printf("%d",n);
       else
       {
          for(i=1,j=k;j<v0.size()-1;i++,j++)
             ans=max(ans,v0[j+1]-v0[i-1]-1);
          for(i=1,j=k;j<v1.size()-1;i++,j++)
             ans=max(ans,v1[j+1]-v1[i-1]-1);
          printf("%d",ans);
       }
       system("pause");
       return 0;
    }
  • 相关阅读:
    bzoj 3226 [Sdoi2008]校门外的区间(线段树)
    bzoj 1513 [POI2006]Tet-Tetris 3D(二维线段树)
    cf293E Close Vertices(树分治+BIT)
    点分治练习:不虚就是要AK
    点分治练习: boatherds
    bzoj 4016 [FJOI2014]最短路径树问题(最短路径树+树分治)
    bzoj 1876 [SDOI2009]SuperGCD(高精度+更相减损)
    464 整数排序Ⅱ
    445 余弦相似度
    488 快乐数
  • 原文地址:https://www.cnblogs.com/VividBinGo/p/12289336.html
Copyright © 2011-2022 走看看