CF1762C 题解

思路

我们手搓一个数据:111011111011

第一个前缀:11。没什么好说,只有 20=12^0=1 种情况。

第二个前缀:1111。这时在中间可以填 0011,出现 21=22^1=2 种情况。

第三个前缀:111111。这时它们之间还是可以随便填,有 22=42^2=4 种情况。

第四个前缀:11101110。此时出现转折——因为出现了子串 1010,所以前面的所有空位都必须填 00,只有一种情况。

第五个前缀:1110111101。它还是顺顺利利可以填任何数字,22 种情况。

第六个前缀:111011111011。它依然可以填任何数字,44 种。

然后我们发现,如果出现 10100101,那么瞬间归 11,否则可以填任何数字,方案数是上一个前缀的 22 倍。最后把所有前缀的方案数累加起来就好。

代码

# 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;
}
posted @ 2024-04-27 15:44  Vitamin_B  阅读(13)  评论(0)    收藏  举报  来源