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







Comments | NOTHING