https://ac.nowcoder.com/acm/contest/884/K

签到题 本场就做出来这一道题 菜的一比

zzq给的题解中的第二种做法并不能看懂
网上搜的题解的思路感觉比较好 在这里写一下

这是题解给的做法 下面那个做法的确是最快的
思路看一下注释吧

拿样例二模拟一下试试看
123000321013200987000789
先求mod
100000020011000020000100
遇到两个连续0更新答案
遇到第一个连续0时 num数组值分别为 3 1 0
ans=3
遇到第二个连续0时 num数组值分别为 4 1 0
ans=7
第三次 10 3 1
ans=17
第四次 14 3 2
ans=31
第五次 15 3 2
ans=46
加上9个0 答案是55

#include<algorithm>
#include<iostream>
#include<vector>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<string>
#include<ctime>
#include<map>
#include<stack>
#include<set>
#include<cstring>
#include<sstream>
#include<queue>
using namespace std;
typedef long long ll;
const int maxn = 1e5 + 5;
char s[maxn];
int num[3], n, mod;
ll ans;
int main() {
	scanf("%s", s + 1);
	ans = 0;
	n = strlen(s + 1);
	num[0] = 1;//初始值 如果是3的倍数 那么就能贡献一个答案
	num[1] = num[2] = 0;//不是三的倍数就不能贡献答案
	mod = 0;
	for (int i = 1; i <= n; i++) {
		mod = (mod * 10 + (s[i] - '0')) % 3;//求总和是不是3的倍数
		if (s[i] == '0' && s[i + 1] == '0') {//如果碰到两个连续0 更新答案
			ans += num[mod];
		}
		num[mod]++;
		if (s[i] == '0') ans++;//如果是‘0’ 答案要加1
	}
	printf("%lld\n", ans);
	return 0;
}

愿风指引你的道路,愿你的刀刃永远锋利。