CF1762C 题解
思路
我们手搓一个数据:。
第一个前缀:。没什么好说,只有 种情况。
第二个前缀:。这时在中间可以填 或 ,出现 种情况。
第三个前缀:。这时它们之间还是可以随便填,有 种情况。
第四个前缀:。此时出现转折——因为出现了子串 ,所以前面的所有空位都必须填 ,只有一种情况。
第五个前缀:。它还是顺顺利利可以填任何数字, 种情况。
第六个前缀:。它依然可以填任何数字, 种。
然后我们发现,如果出现 或 ,那么瞬间归 ,否则可以填任何数字,方案数是上一个前缀的 倍。最后把所有前缀的方案数累加起来就好。
代码
# include <bits/stdc++.h>
typedef long long ll;
using namespace std;
const int mod = 998244353;
int t, n, sum, now;
string a;
int main () {
ios::sync_with_stdio (0);
cin.tie (0);
cout.tie (0);
cin >> t;
while (t --) {
cin >> n >> a;
sum = now = 1;
for (int i = 1; i < n; ++ i) {
if (a[i] != a[i - 1])
now = 1;
else
now <<= 1, now %= mod;
sum += now, sum %= mod;
}
cout << sum << '\n';
}
return 0;
}

浙公网安备 33010602011771号