设 表示以 为结尾的合法序列个数
- 如果 ,那么我们可以在从 到 所包含的序列后面添加 构成答案,也可以单独以 为新的合法序列(也就是后面公式中的+1)。即 。
- 如果 ,那么我们可以在从 到 中所有不以 为结尾的序列后面添加 构成答案,也可以单独以 为新的合法序列(也就是后面公式中的+1)。即 。
最终答案为 。
此时复杂度为 的。
我们可以维护两个前缀和保存答案
那么
这样的复杂度为 的。
最终答案为 ,也就是 。
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 1e6 + 5, mod = 1e9 + 7;
ll f[N], pr6[N], pr[N];
int main() {
string s;
s = "2621";
cin >> s;
int n = s.size();
s = " " + s;
for (int i = 1; i <= n; i++) {
// s[i]:以第i个字符为结尾的合法子序列个数
if (s[i] == '1') {
f[i] = pr6[i - 1] + 1;
} else {
f[i] = pr[i - 1] + 1;
}
pr[i] = pr[i - 1] + f[i];
if (s[i] != '6')
pr6[i] = pr6[i - 1] + f[i];
else
pr6[i] = pr6[i - 1];
pr[i] %= mod;
pr6[i] %= mod;
f[i] %= mod;
}
cout << pr[n] << endl;
return 0;
}