Codeforces 682B New Skateboard(DP)

时间:2021-12-16 14:31:08

题目大概说给一个数字组成的字符串问有几个子串其代表的数字(可以有前导0)能被4整除。

  • dp[i][m]表示字符串0...i中mod 4为m的后缀的个数
  • 通过在i-1添加str[i]字符转移,或者以str[i]为新后缀的开头转移
 #include<cstdio>
#include<cstring>
using namespace std;
char str[];
long long d[][];
int main(){
scanf("%s",str);
for(int i=; str[i]; ++i){
++d[i][(str[i]-'')%];
for(int j=; j<; ++j){
d[i+][(j*+str[i+]-'')%]+=d[i][j];
}
}
long long ans=;
for(int i=; str[i]; ++i){
ans+=d[i][];
}
printf("%lld",ans);
return ;
}