2019牛客暑期多校训练营(第四场)

Result

AC: 2/10, J K
Rank: 441/696
Upsolved: 0/7,

K. number

思路

从右往左扫描字符串
  1. s[i]为'0'时,计数加1("0")。
  2. s[i]='0'且s[i-1]='0',计数加1("00"),考虑以"00"结尾的子串,和为3的倍数即满足题意。
    设后缀和为sum,[0,i-2]区间内满足sum[j]和sum[i-1]模3同余的左端点j的数量即为合法子串数量。
预处理一下不同后缀和(模3意义下)的数量的后缀和即可。

代码

#include<bits/stdc++.h>
using namespace std;
using ll=long long;
#define debug(x) cout<<#x<<' '<<x<<endl
//
const int MAXN=(int)1e5+10;
char str[MAXN];
int c[MAXN][3],s[MAXN];
//
int main()
{
  scanf("%s",str);
  int n=strlen(str);

  for (int i=n-1;i>=0;i--) {
    s[i]=(s[i+1]+(str[i]-'0'))%3;
    for (int j=0;j<3;j++) {
      c[i][j]=c[i+1][j];
    }
    c[i][s[i]]++;
  }

  ll ans=0;
  for (int i=n-1;i>=0;i--) {
    if (str[i]=='0') {
      ans++;
    }
    if (i-1>=0 && str[i]=='0' && str[i-1]=='0') {
      int k=s[i-1];
      ans+=c[0][k]-c[i-1][k]+1;
    }
  }

  cout<<ans<<endl;

  return 0;
}

全部评论

相关推荐

不愿透露姓名的神秘牛友
07-04 14:23
点赞 评论 收藏
分享
Yki_:你要算时间成本呀,研究生两三年,博士三四年,加起来就五六年了,如果你本科去腾讯干五年,多领五年的年薪,加上公司内涨薪,可能到时候十五年总薪资也跟博士差不多
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-02 17:28
25届每天都在焦虑找工作的事情0offer情绪一直很低落硬撑着面了一个岗位岗位有应酬的成分面试的时候hr给我出各种场景题问的问题比较犀利&nbsp;有点压力面的感觉感觉有点回答不上来本来就压抑的情绪瞬间爆发了呢一瞬间特别想哭觉得自己特别没用没绷住掉眼泪了事后想想觉得自己挺有病的&nbsp;真的破大防了
喜欢唱跳rap小刺猬...:我觉得没关系吧,之前有一次面试leader给我压力面,我顶住了压力,结果入职的时候发现组里氛围很差,果断跑路。其实从面试就能大概看出组的情况,面试体验好的组倒是不一定好,但是面试体验不好的组。。。就很难说
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务