提交时间:2024-10-14 13:43:46

运行 ID: 33593

#include <cstdio> #include <iostream> #include <algorithm> #include <cstring> #include <vector> using namespace std; int n; int c[5000010][26]; string s; struct node { int l, r; bool operator < (const node & b) const { if (l != b.l) return l < b.l; return r < b.r; } }; int main() { cin >> s; n = s.size(); s = " " + s; for (int i = 1; i <= n; i++) { for (int j = 0; j <= 25; j++) c[i][j] = c[i - 1][j]; c[i][s[i] - 'a'] = i; } long long ans = 0; for (int i = 1; i <= n; i++) { vector<node> v; for (int j = 0; j <= 25; j++) { int r = c[i][j]; if (r == 0) continue; int l = c[r - 1][j] + 1; if (l <= r) v.push_back((node){l, r}); } sort(v.begin(), v.end()); int y = 0; for (int j = 0; j < v.size(); j++) { int l = v[j].l; int r = v[j].r; if (l > y) ans += r - l + 1; else if (r > y) ans += r - y; y = max(y, r); } } cout << ans << endl; return 0; }