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';
}

浙公网安备 33010602011771号