欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

2019牛客暑期多校训练营(第四场)K number(思维)

程序员文章站 2022-04-02 22:09:50
...

题意:求可以被300整数的子串数量。

思路:有个On的做法,令mo[i]为前i位和模3的值,那么对于一个区间[l,r],且s[r+1]==s[r+2]==0,合法条件是s[r]=s[i](l<i<r)。

模相等间隔必定是3的倍数。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll cnt[5], ans;
char s[100010];
int main() {
    scanf("%s", s);
    cnt[0] = 1;
    int mo = 0;
    for(int i = 0; s[i] != '\0'; i++) {
        if(s[i] == '0')
            ans++;
        if(s[i] == '0' && s[i + 1] == '0') {
            ans += cnt[mo];
        }
        mo = (mo + s[i] - '0') % 3;
        cnt[mo]++;
    }
    printf("%lld\n", ans);
    return 0;
}