#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'; } |
English