考核知识点:字符串、双指针
遍历字符串,使用滑动窗口维护当前不含'd'的子串。在窗口内,记录字符'r'和'e'的最新出现位置。当遇到'd'时,重置窗口。对于每个有效的窗口,如果其中同时包含'r'和'e',则计算以当前位置为右端点,且满足条件的子串数量。这个数量可以通过窗口左边界到'r'和'e'中较早出现位置的距离来确定。将所有满足条件的子串数量累加得到最终结果。
#include <bits/stdc++.h>
using namespace std;
using LL = long long;
string s, t;
LL ans;
LL calc(LL len) {
return len * (len + 1) / 2;
}
void solve(string s) {
map<int, int> mp;
ans += calc(s.size());
for (int i = 0, j = 0; i < s.size(); ++i) {
++mp[s[i]];
while (mp['r'] && mp['e']) {
--mp[s[j]];
++j;
}
ans -= i - j + 1;
}
}
int main() {
cin >> s;
for (auto& i : s) {
if (i == 'd') {
solve(t);
t = "";
} else {
t += i;
}
}
solve(t);
cout << ans << endl;
return 0;
}



京公网安备 11010502036488号