提交时间:2024-10-04 14:21:39
运行 ID: 33109
#include <cstdio> #include <iostream> #include <algorithm> #include <cstring> using namespace std; string s; int n, l[30], r[30]; int k, c[30][3000010]; long long cal(int x) { long long ret = 0; for (int i = 1; i <= k; i++) { int p1 = upper_bound(c[i] + x, c[i] + n + 1, c[i][x - 1]) - c[i]; int p2 = lower_bound(c[i] + x, c[i] + n + 1, c[i][x - 1] + 2) - c[i]; if (p1 < 1 || p1 > n) p1 = n + 1; if (p2 < 1 || p2 > n) p2 = n + 1; p2--; l[i] = p1, r[i] = p2; for (int j = 1; j < i; j++) { if (l[j] > r[j]) continue; if (l[j] <= l[i] && r[j] <= r[i]) { if (r[j] < l[i]) continue; else l[i] = r[j] + 1; } else if (l[j] <= l[i] && r[j] > r[i]) l[i] = r[i] + 1; else if (l[j] > l[i] && r[j] <= r[i]) { ret -= r[j] - l[j] + 1; l[j] = r[j] + 1; } else if (r[i] < l[j]) continue; else r[i] = l[j] - 1; } ret += r[i] - l[i] + 1; } return ret; } int main() { cin >> s; n = s.size(); s = " " + s; for (int i = 1; i <= n; i++) { for (int j = 1; j <= 26; j++) c[j][i] = c[j][i - 1]; c[s[i] - 'a' + 1][i]++; } for (int i = 1; i <= 26; i++) if (c[i][n] != 0) { k++; for (int j = 1; j <= n; j++) c[k][j] = c[i][j]; } long long ans = 0; for (int i = 1; i <= n; i++) { ans += cal(i); // cout << cal(i) << endl; } printf("%lld\n", ans); return 0; }