#include <cstdio>
#include <cstring>
#include <map>
#include <tuple>
using namespace std;
char s[300001];
int main()
{
  int n;
    
  scanf("%s", s);
  n = strlen(s);
  
  long long ret = 0;
  int i = 0;
  while (i < n)
  {
    char pop = s[i];
    int k = 0;
    while (i < n && pop == s[i])
    {
      k++;
      i++;
    }
    ret += 1LL * (k + 1) * k / 2;
  }
  //printf("ret %lld\n", ret);
  
  {
    map<tuple<int, int, int>, int> M;
    
    //ab
    int a = 0, b = 0, c = 0;
    M[std::make_tuple(0,0,0)] = 1;
    for (int i = 0; i < n; i++)
    {
      if (s[i] == 'c')
      {
        M.clear();
        M[std::make_tuple(0,0,0)] = 1;
        a = 0, b = 0;
        continue;
      }
      if (s[i] == 'a') a++;
      else b++;
      int r = min(a, b);
      a -= r;
      b -= r;
      auto it = M.find(std::make_tuple(a,b,c));
      if (it == M.end()) 
      {
        M[std::make_tuple(a,b,c)] = 1; 
        continue;
      }
      ret += it->second;
      it->second++;
    }
  }
  
  
  //printf("ret %lld\n", ret);
  {
    map<tuple<int, int, int>, int> M;
    
    //ac
    int a = 0, b = 0, c = 0;
    M[std::make_tuple(0,0,0)] = 1;
    for (int i = 0; i < n; i++)
    {
      if (s[i] == 'b')
      {
        M.clear();
        M[std::make_tuple(0,0,0)] = 1;
        a = 0, c = 0;
        continue;
      }
      if (s[i] == 'a') a++;
      else c++;
      int r = min(a, c);
      a -= r;
      c -= r;
      auto it = M.find(std::make_tuple(a,b,c));
      if (it == M.end()) 
      {
        M[std::make_tuple(a,b,c)] = 1; 
        continue;
      }
      ret += it->second;
      it->second++;
    }
  }
  //printf("ret %lld\n", ret);
  
  {
    map<tuple<int, int, int>, int> M;
    
    //bc
    int a = 0, b = 0, c = 0;
    M[std::make_tuple(0,0,0)] = 1;
    for (int i = 0; i < n; i++)
    {
      if (s[i] == 'a')
      {
        M.clear();
        M[std::make_tuple(0,0,0)] = 1;
        b = 0, c = 0;
        continue;
      }
      if (s[i] == 'b') b++;
      else c++;
      int r = min(b, c);
      b -= r;
      c -= r;
      auto it = M.find(std::make_tuple(a,b,c));
      if (it == M.end()) 
      {
        M[std::make_tuple(a,b,c)] = 1; 
        continue;
      }
      ret += it->second;
      it->second++;
    }
  }
  
  //printf("ret %lld\n", ret);
  {
    map<tuple<int, int, int>, int> M;
    
    //abc
    int a = 0, b = 0, c = 0;
    M[std::make_tuple(0,0,0)] = 1;
    for (int i = 0; i < n; i++)
    {
      if (s[i] == 'a') a++;
      else
      if (s[i] == 'b') b++;
      else c++;
      int r = min(b, c);
      r = min(r, a);
      a -= r;
      b -= r;
      c -= r;
      auto it = M.find(std::make_tuple(a,b,c));
      if (it == M.end()) 
      {
        M[std::make_tuple(a,b,c)] = 1; 
        continue;
      }
      ret += it->second;
      it->second++;
    }
  }
  
  printf("%lld\n", ret);
  
  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 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 | #include <cstdio> #include <cstring> #include <map> #include <tuple> using namespace std; char s[300001]; int main() { int n; scanf("%s", s); n = strlen(s); long long ret = 0; int i = 0; while (i < n) { char pop = s[i]; int k = 0; while (i < n && pop == s[i]) { k++; i++; } ret += 1LL * (k + 1) * k / 2; } //printf("ret %lld\n", ret); { map<tuple<int, int, int>, int> M; //ab int a = 0, b = 0, c = 0; M[std::make_tuple(0,0,0)] = 1; for (int i = 0; i < n; i++) { if (s[i] == 'c') { M.clear(); M[std::make_tuple(0,0,0)] = 1; a = 0, b = 0; continue; } if (s[i] == 'a') a++; else b++; int r = min(a, b); a -= r; b -= r; auto it = M.find(std::make_tuple(a,b,c)); if (it == M.end()) { M[std::make_tuple(a,b,c)] = 1; continue; } ret += it->second; it->second++; } } //printf("ret %lld\n", ret); { map<tuple<int, int, int>, int> M; //ac int a = 0, b = 0, c = 0; M[std::make_tuple(0,0,0)] = 1; for (int i = 0; i < n; i++) { if (s[i] == 'b') { M.clear(); M[std::make_tuple(0,0,0)] = 1; a = 0, c = 0; continue; } if (s[i] == 'a') a++; else c++; int r = min(a, c); a -= r; c -= r; auto it = M.find(std::make_tuple(a,b,c)); if (it == M.end()) { M[std::make_tuple(a,b,c)] = 1; continue; } ret += it->second; it->second++; } } //printf("ret %lld\n", ret); { map<tuple<int, int, int>, int> M; //bc int a = 0, b = 0, c = 0; M[std::make_tuple(0,0,0)] = 1; for (int i = 0; i < n; i++) { if (s[i] == 'a') { M.clear(); M[std::make_tuple(0,0,0)] = 1; b = 0, c = 0; continue; } if (s[i] == 'b') b++; else c++; int r = min(b, c); b -= r; c -= r; auto it = M.find(std::make_tuple(a,b,c)); if (it == M.end()) { M[std::make_tuple(a,b,c)] = 1; continue; } ret += it->second; it->second++; } } //printf("ret %lld\n", ret); { map<tuple<int, int, int>, int> M; //abc int a = 0, b = 0, c = 0; M[std::make_tuple(0,0,0)] = 1; for (int i = 0; i < n; i++) { if (s[i] == 'a') a++; else if (s[i] == 'b') b++; else c++; int r = min(b, c); r = min(r, a); a -= r; b -= r; c -= r; auto it = M.find(std::make_tuple(a,b,c)); if (it == M.end()) { M[std::make_tuple(a,b,c)] = 1; continue; } ret += it->second; it->second++; } } printf("%lld\n", ret); return 0; } | 
 
            
         English
                    English