C. Unstable String

https://codeforces.com/problemset/problem/1535/C

题意:给定一个长度为n的字符串s,s包含0,1,或者?,问有多少子串符合条件。 条件:子串没有相邻的0或者相邻的1。?可以当作0或者1。

思路:答案最初设定为子串的数量,然后去寻找不符合条件的子串t,并将包含t的所有串数量从答案中剔除。这里不符合条件的子串应该考虑当前字符与上一个字符,如果两个字符相等且之间的距离为偶数,则该串需要被剔除。如果字符不相等且字符之间距离为奇数,则也需要被剔除。 另外,为了避免相同的字符串被剔除多次,我们需要设定一个剔除起点,防止出现比如有字符串:0011,我们在剔除00的时候已经考虑了00, 001, 0011,那么后面在考虑11的时候,就不能有0011了,所以需要将起点设定为位置3。

总结:题目有点难,一眼没思路,只能静下心来慢慢想,哎。最近做题越来越难了,是难度变高了,还是人变菜了。

inline void solve() {
	string s;
	cin >> s;

	int n = (int)s.size();

	long long ans = (1ll * n * (n + 1)) / 2;
	int i = 0;
	int last = 0;
	while (i < n && s[i] == '?') {
		i ++;
	}
	for (int j = i + 1; j < n; ++j) {
		if (s[j] == '?') {
			continue;
		}
		int interval = j - i - 1;
		if (s[j] == s[i] && interval % 2 == 0) {
			ans -= (1ll * (i - last + 1) * (n - j));
			last = i + 1;
			i = j;
		}
		else if (s[j] != s[i] && (interval & 1)) {
			ans -= (1ll * (i - last + 1) * (n - j));
			last = i + 1;
			i = j;
		}
		else {
			i = j;
		}
	}

	cout << ans << '\n';
}
posted @ 2025-03-27 11:42  _Yxc  阅读(17)  评论(0)    收藏  举报