#include <bits/stdc++.h> using namespace std; string s; long long res; const char litery[3] = {'a', 'b', 'c'}; long long ile; long long teraz; long long roznica2; char a, b; map<long long, long long> umap2; pair<long long, long long> roznica3; bool jestA, jestB, jestC; map<pair<long long, long long>, long long> umap3; long long jeden(int l) // jest litera { ile = 0; teraz = 0; for (int i = 0; i < s.length(); ++i) { if (s[i] != litery[l]) teraz = 0; else ile += ++teraz; } return ile; } long long dwa(int l) // nie ma litery { ile = 0; roznica2 = 0; umap2.clear(); umap2[0] = 1; a = litery[(l + 1) % 3]; b = litery[(l + 2) % 3]; for (int i = 0; i < s.length(); ++i) { if (s[i] == litery[l]) { roznica2 = 0; umap2.clear(); umap2[0] = 1; } else { if (s[i] == a) umap2[++roznica2]++; else if (s[i] == b) umap2[--roznica2]++; // cout << "ile: " << i << ' ' << roznica2 << ' ' << s[i] << ' ' << umap2[roznica2] - 1 << '\n'; ile += umap2[roznica2] - 1; } } return ile; } long long trzy() { ile = 0; roznica3 = {0, 0}; umap3[roznica3] = 1; for (int i = 0; i < s.length(); ++i) { if (s[i] == 'a') { jestA = true; roznica3.first--; roznica3.second--; } else if (s[i] == 'b') { jestB = true; roznica3.first++; } else if (s[i] == 'c') { jestC = true; roznica3.second++; } umap3[roznica3]++; // if (umap3[roznica3] > 1) // cout << '!'; if (jestA && jestB && jestC) ile += umap3[roznica3] - 1; // cout << "ile: " << i << ' ' << roznica3.first << ' ' << roznica3.second << ' ' << s[i] << ' ' << umap3[roznica3] - 1 << '\n'; } return ile; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> s; for (int i = 0; i < 3; ++i) { res += jeden(i); // cout << litery[i] << ' ' << jeden(i) << '\n'; } for (int i = 0; i < 3; ++i) { res += dwa(i); // cout << litery[(i + 1) % 3] << litery[(i + 2) % 3] << ' ' << dwa(i) << '\n'; } res += trzy(); // cout << "abc " << trzy() << '\n'; cout << res << '\n'; }
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 103 104 105 106 107 108 109 110 111 112 | #include <bits/stdc++.h> using namespace std; string s; long long res; const char litery[3] = {'a', 'b', 'c'}; long long ile; long long teraz; long long roznica2; char a, b; map<long long, long long> umap2; pair<long long, long long> roznica3; bool jestA, jestB, jestC; map<pair<long long, long long>, long long> umap3; long long jeden(int l) // jest litera { ile = 0; teraz = 0; for (int i = 0; i < s.length(); ++i) { if (s[i] != litery[l]) teraz = 0; else ile += ++teraz; } return ile; } long long dwa(int l) // nie ma litery { ile = 0; roznica2 = 0; umap2.clear(); umap2[0] = 1; a = litery[(l + 1) % 3]; b = litery[(l + 2) % 3]; for (int i = 0; i < s.length(); ++i) { if (s[i] == litery[l]) { roznica2 = 0; umap2.clear(); umap2[0] = 1; } else { if (s[i] == a) umap2[++roznica2]++; else if (s[i] == b) umap2[--roznica2]++; // cout << "ile: " << i << ' ' << roznica2 << ' ' << s[i] << ' ' << umap2[roznica2] - 1 << '\n'; ile += umap2[roznica2] - 1; } } return ile; } long long trzy() { ile = 0; roznica3 = {0, 0}; umap3[roznica3] = 1; for (int i = 0; i < s.length(); ++i) { if (s[i] == 'a') { jestA = true; roznica3.first--; roznica3.second--; } else if (s[i] == 'b') { jestB = true; roznica3.first++; } else if (s[i] == 'c') { jestC = true; roznica3.second++; } umap3[roznica3]++; // if (umap3[roznica3] > 1) // cout << '!'; if (jestA && jestB && jestC) ile += umap3[roznica3] - 1; // cout << "ile: " << i << ' ' << roznica3.first << ' ' << roznica3.second << ' ' << s[i] << ' ' << umap3[roznica3] - 1 << '\n'; } return ile; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> s; for (int i = 0; i < 3; ++i) { res += jeden(i); // cout << litery[i] << ' ' << jeden(i) << '\n'; } for (int i = 0; i < 3; ++i) { res += dwa(i); // cout << litery[(i + 1) % 3] << litery[(i + 2) % 3] << ' ' << dwa(i) << '\n'; } res += trzy(); // cout << "abc " << trzy() << '\n'; cout << res << '\n'; } |