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