题解:
设立二维dp[i][j]表明以i为结尾,%3为j的个数,从头到尾扫描一遍进行更新。
#include <bits/stdc++.h>
typedef long long LL;
using namespace std;
int dp[1000005][3];
int main(){
string s;
while(cin>>s){
memset(dp,0,sizeof(dp));
int ls=s.length();
LL ans=0;
for(int i=0;i<ls;i++){
if(s[i]=='0'){
dp[i+1][0]=dp[i][0]+1;
dp[i+1][1]=dp[i][2];
dp[i+1][2]=dp[i][1];
}
else{
dp[i+1][0]=dp[i][1];
dp[i+1][1]=dp[i][0]+1;
dp[i+1][2]=dp[i][2];
}
ans+=dp[i+1][0];
}
cout<<ans<<endl;
}
}