题目描述
Eve 有一个字符串 SS,该字符串仅由字符 *
、4
和 0
组成。字符 *
可以被替换为 4
或 0
。
Eve 想要计算在所有可能通过替换 *
生成的字符串中,包含子序列 404
的总数。由于这个数字可能非常大,你需要其输出模 109+7109+7 的结果。
例如,当 SS 为 4*4*
时,可以替换为 4040,4044,4440,4444
,其中分别有 1,2,0,01,2,0,0 个 404
子序列,共 33 个。
输入格式
第一行一个整数 TT 表示数据组数。对于每组数据:
第一行一个整数 nn 表示 SS 的长度。
第二行一个字符串 SS。
输出格式
对于每组数据,输出一行一个整数表示答案。
数据范围
对于 30%30% 的数据,1≤T≤101≤T≤10,1≤n,∑n≤101≤n,∑n≤10。
对于 60%60% 的数据,1≤T≤1001≤T≤100,1≤n,∑n≤1001≤n,∑n≤100。
对于 100%100% 的数据,1≤T≤1051≤T≤105,1≤n≤1051≤n≤105,1≤∑n≤1061≤∑n≤106,SS 中仅包含 4
、0
和 *
三种字符。
样例数据
输入:
2
4
4*04
4
4*4*
输出:
4
3
说明:
第二组数据即为题目描述中举的例子。
详见代码:
#include<bits/stdc++.h>
using namespace std;
int t, m, n;
int mod = 1e9 + 7;
long long dp4;
long long dp40;
long long dp404;
long long p;
int main()
{cin >> t;while(t--) {dp4=0;dp40=0;dp404=0;p=1;cin >> n;string s;cin >> s;for(int i = 0; i < n; i++) {if (s[i] == '4') { dp4 += p; dp404 += dp40;}else if (s[i] == '0') {dp40 += dp4; } else if (s[i] == '*') { dp404 = dp404 * 2 + dp40;dp40 = dp40 * 2 + dp4;dp4 = dp4 * 2 + p;p *= 2;}dp4 %= mod;dp40 %= mod;dp404 %= mod;p %= mod;}cout << dp404 << "\n";}return 0;
}