考核知识点:字符串、双指针

遍历字符串,使用滑动窗口维护当前不含'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;
}