题意:一个01序列,长度1e6,问有多少子串十进制是3的倍数
题解:DP[i][j]代表前i个并且以i为结尾,且十进制%3==j的串的个数
#include<bits/stdc++.h> #define maxn 1001000 using namespace std; char s[maxn]; long long dp[maxn][3], sum; int main(){ while(~scanf("%s", s+1)){ sum = 0; int l = strlen(s+1); for(int i=1;i<=l;i++){ if(s[i] == '0'){ dp[i][0] = dp[i-1][0]+1; dp[i][2] = dp[i-1][1]; dp[i][1] = dp[i-1][2]; } else{ dp[i][0] = dp[i-1][1]; dp[i][1] = dp[i-1][0]+1; dp[i][2] = dp[i-1][2]; } sum += dp[i][0]; } cout<<sum<<endl; } return 0; }