solution
d
p
[
i
]
[
j
]
表
示
第
i
位
为
止
有
多
少
%
3
=
j
的
方
案
数
dp[i][j]表示第i位为止有多少\%3=j的方案数
dp[i][j]表示第i位为止有多少%3=j的方案数
记
前
一
个
状
态
为
t
e
m
p
i
−
1
,
记前一个状态为temp_{i-1},
记前一个状态为tempi−1,
s
[
i
]
=
=
1
时
,
t
e
m
p
i
=
(
t
e
m
p
i
−
1
∗
2
+
1
)
%
3
s[i]==1时,temp_i=(temp_{i-1}*2+1)\%3
s[i]==1时,tempi=(tempi−1∗2+1)%3
d
p
[
i
]
[
0
]
=
d
p
[
i
−
1
]
[
1
]
dp[i][0]=dp[i-1][1]
dp[i][0]=dp[i−1][1]
d
p
[
i
]
[
1
]
=
d
p
[
i
−
1
]
[
0
]
+
1
dp[i][1]=dp[i-1][0]+1
dp[i][1]=dp[i−1][0]+1
d
p
[
i
]
[
2
]
=
d
p
[
i
−
1
]
[
2
]
dp[i][2]=dp[i-1][2]
dp[i][2]=dp[i−1][2]
s [ i ] = = 0 时 , t e m p i = t e m p i − 1 ∗ 2 % 3 s[i]==0时,temp_i=temp_{i-1}*2\%3 s[i]==0时,tempi=tempi−1∗2%3 d p [ i ] [ 0 ] = d p [ i − 1 ] [ 0 ] + 1 dp[i][0]=dp[i-1][0]+1 dp[i][0]=dp[i−1][0]+1 d p [ i ] [ 1 ] = d p [ i − 1 ] [ 2 ] + 1 dp[i][1]=dp[i-1][2]+1 dp[i][1]=dp[i−1][2]+1 d p [ i ] [ 2 ] = d p [ i − 1 ] [ 1 ] dp[i][2]=dp[i-1][1] dp[i][2]=dp[i−1][1]
统 计 ∑ i = 1 l e n d p [ i ] [ 0 ] 的 个 数 即 可 . 统计\sum\limits_{i=1}^{len}dp[i][0]的个数即可. 统计i=1∑lendp[i][0]的个数即可.
code
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
ll dp[int(1e6 + 10)][3];
int main() {
string s; while(cin >> s) {
int len = s.size(); s = " " + s;
memset(dp, 0, sizeof dp);
for(int i = 1; i <= len; ++ i) {
if(s[i] == '1') {
dp[i][0] += dp[i - 1][1];
dp[i][1] += dp[i - 1][0] + 1;
dp[i][2] += dp[i - 1][2];
} else {
dp[i][0] += dp[i - 1][0] + 1;
dp[i][1] += dp[i - 1][2];
dp[i][2] += dp[i - 1][1];
}
}
ll res = 0; for(int i = 1; i <= len; ++ i) res += dp[i][0];
cout << res << '\n';
}
return 0;
}