#include <iostream> using namespace std; string s; const int maxS = 300000; int pref[3][maxS], suf[3][maxS], nr[3], suma[3]; bool czySpelnia() { if((nr[0] == 0 && nr[1] == nr[2]) || (nr[1] == 0 && nr[0] == nr[2]) || (nr[2] == 0 && nr[1] == nr[0]) || (nr[0] == 0 && (nr[1] == 0 || nr[2] == 0)) || (nr[2] == 0 && nr[1] == 0) || (nr[0] == nr[1] && nr[1] == nr[2] && nr[2] == nr[0])) return true; return false; } void brut100() { int wyn = 0; for(int i = 0; i < s.size(); i++) for(int j = i; j < s.size(); j++) { nr[0] = 0; nr[1] = 0; nr[2] = 0; for(int k = i; k <= j; k++) nr[s[k] - 'a']++; if(czySpelnia()) wyn++; } cout << wyn; } int main(int argc, char** argv) { int wyn = 0; cin >> s; /*if(s.size() <= 100) { brut100(); return 0; }*/ for(int i = 0; i < s.size(); i++) suma[s[i] - 'a']++; for(int i = 1; i < s.size(); i++) { pref[0][i] = pref[0][i - 1]; pref[1][i] = pref[1][i - 1]; pref[2][i] = pref[2][i - 1]; pref[s[i - 1] - 'a'][i]++; } for(int i = s.size() - 2; i >= 0; i--) { suf[0][i] = suf[0][i + 1]; suf[1][i] = suf[1][i + 1]; suf[2][i] = suf[2][i + 1]; suf[s[i + 1] - 'a'][i]++; } for(int i = 0; i < s.size(); i++) for(int j = i; j < s.size(); j++) { for(int k = 0; k < 3; k++) nr[k] = suma[k] - pref[k][i] - suf[k][j]; if(czySpelnia()) wyn++; } cout << wyn; 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 | #include <iostream> using namespace std; string s; const int maxS = 300000; int pref[3][maxS], suf[3][maxS], nr[3], suma[3]; bool czySpelnia() { if((nr[0] == 0 && nr[1] == nr[2]) || (nr[1] == 0 && nr[0] == nr[2]) || (nr[2] == 0 && nr[1] == nr[0]) || (nr[0] == 0 && (nr[1] == 0 || nr[2] == 0)) || (nr[2] == 0 && nr[1] == 0) || (nr[0] == nr[1] && nr[1] == nr[2] && nr[2] == nr[0])) return true; return false; } void brut100() { int wyn = 0; for(int i = 0; i < s.size(); i++) for(int j = i; j < s.size(); j++) { nr[0] = 0; nr[1] = 0; nr[2] = 0; for(int k = i; k <= j; k++) nr[s[k] - 'a']++; if(czySpelnia()) wyn++; } cout << wyn; } int main(int argc, char** argv) { int wyn = 0; cin >> s; /*if(s.size() <= 100) { brut100(); return 0; }*/ for(int i = 0; i < s.size(); i++) suma[s[i] - 'a']++; for(int i = 1; i < s.size(); i++) { pref[0][i] = pref[0][i - 1]; pref[1][i] = pref[1][i - 1]; pref[2][i] = pref[2][i - 1]; pref[s[i - 1] - 'a'][i]++; } for(int i = s.size() - 2; i >= 0; i--) { suf[0][i] = suf[0][i + 1]; suf[1][i] = suf[1][i + 1]; suf[2][i] = suf[2][i + 1]; suf[s[i + 1] - 'a'][i]++; } for(int i = 0; i < s.size(); i++) for(int j = i; j < s.size(); j++) { for(int k = 0; k < 3; k++) nr[k] = suma[k] - pref[k][i] - suf[k][j]; if(czySpelnia()) wyn++; } cout << wyn; return 0; } |