/*
* zba.cpp
*
* Created on: 4 gru 2021
* Author: chodnik
*/
#include <iostream>
#include <string>
using namespace std;
class Counter {
public:
int abc[3]; // = {0, 0, 0};
Counter() :
abc { 0 } {
}
void add(char s, int groupSize) {
abc[s - 'a'] += groupSize;
}
bool has_balanced_in_range(char groupChar, int groupSize) {
int v0 = abc[groupChar - 'a'], v1 = 0, v2 = 0;
if (groupChar == 'a') {
if (abc[1] < abc[2]) {
v1 = abc[1];
v2 = abc[2];
} else {
v1 = abc[2];
v2 = abc[1];
}
} else if (groupChar == 'b') {
if (abc[0] < abc[2]) {
v1 = abc[0];
v2 = abc[2];
} else {
v1 = abc[2];
v2 = abc[0];
}
} else if (groupChar == 'c') {
if (abc[0] < abc[1]) {
v1 = abc[0];
v2 = abc[1];
} else {
v1 = abc[1];
v2 = abc[0];
}
}
if (v0 >= v2) {
return false;
} else if ((v1 == 0 || v1 == v2) && v0 < v2 && v0 + groupSize >= v2) {
return true;
} else {
return false;
}
}
};
int main() {
ios_base::sync_with_stdio(false);
string word; // ("aabbabcccba");
cin >> word;
int L = word.length();
int left[L];// = new int[L];
{
char prev = 'z';
int total = 0;
for (int i = L - 1; i >= 0; i--) {
if (word[i] == prev) {
total++;
} else {
prev = word[i];
total = 1;
}
left[i] = total;
}
}
long long result = 0;
for (int i = 0; i < L; i++) {
int from = i;
int groupSize = left[from];
result += groupSize;
Counter counterFrom;
counterFrom.add(word[i], groupSize);
from += groupSize;
while (from < L) {
groupSize = left[from];
char groupChar = word[from];
if (counterFrom.has_balanced_in_range(groupChar, groupSize)) {
result++;
}
counterFrom.add(groupChar, groupSize);
from += groupSize;
}
// if(i%1000==0){
// cout<<"i="<<i<<endl;
// }
}
cout << result << endl;
return 0;
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 | /* * zba.cpp * * Created on: 4 gru 2021 * Author: chodnik */ #include <iostream> #include <string> using namespace std; class Counter { public: int abc[3]; // = {0, 0, 0}; Counter() : abc { 0 } { } void add(char s, int groupSize) { abc[s - 'a'] += groupSize; } bool has_balanced_in_range(char groupChar, int groupSize) { int v0 = abc[groupChar - 'a'], v1 = 0, v2 = 0; if (groupChar == 'a') { if (abc[1] < abc[2]) { v1 = abc[1]; v2 = abc[2]; } else { v1 = abc[2]; v2 = abc[1]; } } else if (groupChar == 'b') { if (abc[0] < abc[2]) { v1 = abc[0]; v2 = abc[2]; } else { v1 = abc[2]; v2 = abc[0]; } } else if (groupChar == 'c') { if (abc[0] < abc[1]) { v1 = abc[0]; v2 = abc[1]; } else { v1 = abc[1]; v2 = abc[0]; } } if (v0 >= v2) { return false; } else if ((v1 == 0 || v1 == v2) && v0 < v2 && v0 + groupSize >= v2) { return true; } else { return false; } } }; int main() { ios_base::sync_with_stdio(false); string word; // ("aabbabcccba"); cin >> word; int L = word.length(); int left[L];// = new int[L]; { char prev = 'z'; int total = 0; for (int i = L - 1; i >= 0; i--) { if (word[i] == prev) { total++; } else { prev = word[i]; total = 1; } left[i] = total; } } long long result = 0; for (int i = 0; i < L; i++) { int from = i; int groupSize = left[from]; result += groupSize; Counter counterFrom; counterFrom.add(word[i], groupSize); from += groupSize; while (from < L) { groupSize = left[from]; char groupChar = word[from]; if (counterFrom.has_balanced_in_range(groupChar, groupSize)) { result++; } counterFrom.add(groupChar, groupSize); from += groupSize; } // if(i%1000==0){ // cout<<"i="<<i<<endl; // } } cout << result << endl; return 0; } |
English