#include <bits/stdc++.h>
using namespace std;
int calculateValidSegments(string codeSequence) {
int n = codeSequence.size();
long long ans = 0;
vector<int> freq(7, 0);
int distinct = 0;
int maxFreq = 0;
int r = 0;
for (int l = 0; l < n; l++) {
while (r < n) {
int idx = codeSequence[r] - 'a';
freq[idx]++;
if (freq[idx] == 1)
distinct++;
maxFreq = max(maxFreq, freq[idx]);
// Invalid → rollback and stop
if (maxFreq > distinct) {
freq[idx]--;
if (freq[idx] == 0)
distinct--;
break;
}
r++;
}
// All substrings [l..l], [l..l+1] ... [l..r-1]
ans += (r - l);
// Remove left character
int leftIdx = codeSequence[l] - 'a';
freq[leftIdx]--;
if (freq[leftIdx] == 0)
distinct--;
// Recompute maxFreq (only 7 chars → cheap)
maxFreq = 0;
for (int i = 0; i < 7; i++)
maxFreq = max(maxFreq, freq[i]);
}
return ans;
}
int main() {
cout<<calculateValidSegments("aaccd");
return 0;
}
CiNpbmNsdWRlIDxiaXRzL3N0ZGMrKy5oPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKaW50IGNhbGN1bGF0ZVZhbGlkU2VnbWVudHMoc3RyaW5nIGNvZGVTZXF1ZW5jZSkgewogICAgaW50IG4gPSBjb2RlU2VxdWVuY2Uuc2l6ZSgpOwogICAgbG9uZyBsb25nIGFucyA9IDA7CgogICAgdmVjdG9yPGludD4gZnJlcSg3LCAwKTsKICAgIGludCBkaXN0aW5jdCA9IDA7CiAgICBpbnQgbWF4RnJlcSA9IDA7CgogICAgaW50IHIgPSAwOwoKICAgIGZvciAoaW50IGwgPSAwOyBsIDwgbjsgbCsrKSB7CiAgICAgICAgd2hpbGUgKHIgPCBuKSB7CiAgICAgICAgICAgIGludCBpZHggPSBjb2RlU2VxdWVuY2Vbcl0gLSAnYSc7CiAgICAgICAgICAgIGZyZXFbaWR4XSsrOwoKICAgICAgICAgICAgaWYgKGZyZXFbaWR4XSA9PSAxKQogICAgICAgICAgICAgICAgZGlzdGluY3QrKzsKCiAgICAgICAgICAgIG1heEZyZXEgPSBtYXgobWF4RnJlcSwgZnJlcVtpZHhdKTsKCiAgICAgICAgICAgIC8vIEludmFsaWQg4oaSIHJvbGxiYWNrIGFuZCBzdG9wCiAgICAgICAgICAgIGlmIChtYXhGcmVxID4gZGlzdGluY3QpIHsKICAgICAgICAgICAgICAgIGZyZXFbaWR4XS0tOwogICAgICAgICAgICAgICAgaWYgKGZyZXFbaWR4XSA9PSAwKQogICAgICAgICAgICAgICAgICAgIGRpc3RpbmN0LS07CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcisrOwogICAgICAgIH0KCiAgICAgICAgLy8gQWxsIHN1YnN0cmluZ3MgW2wuLmxdLCBbbC4ubCsxXSAuLi4gW2wuLnItMV0KICAgICAgICBhbnMgKz0gKHIgLSBsKTsKCiAgICAgICAgLy8gUmVtb3ZlIGxlZnQgY2hhcmFjdGVyCiAgICAgICAgaW50IGxlZnRJZHggPSBjb2RlU2VxdWVuY2VbbF0gLSAnYSc7CiAgICAgICAgZnJlcVtsZWZ0SWR4XS0tOwogICAgICAgIGlmIChmcmVxW2xlZnRJZHhdID09IDApCiAgICAgICAgICAgIGRpc3RpbmN0LS07CgoKICAgICAgICAvLyBSZWNvbXB1dGUgbWF4RnJlcSAob25seSA3IGNoYXJzIOKGkiBjaGVhcCkKICAgICAgICBtYXhGcmVxID0gMDsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDc7IGkrKykKICAgICAgICAgICAgbWF4RnJlcSA9IG1heChtYXhGcmVxLCBmcmVxW2ldKTsKICAgIH0KCiAgICByZXR1cm4gYW5zOwp9CgoKaW50IG1haW4oKSB7CiAgICBjb3V0PDxjYWxjdWxhdGVWYWxpZFNlZ21lbnRzKCJhYWNjZCIpOwogICAgcmV0dXJuIDA7Cn0K