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
#include <iostream>
#include <list>
#include <string>

typedef long long ll;

char sam[] = {'a', 'e', 'i', 'o', 'u', 'y'};

bool isSam(char c) {
  for (int i = 0; i < 6; i ++) {
    if (c == sam[i]) {
      return true;
    }
  }
  return false;
}

ll generateScore(ll start_pos, ll current_pos, ll length) {
  ll left = current_pos - start_pos + 1;
  ll right = length - current_pos - 2;
  //std::cerr << left << " * " << right << " = " << left*right<< std::endl;
  return left * right;
}

int main() {
  ll sc = 0;
  ll oc = 0;
  std::list<bool> sam_list;

  std::string input;
  std::cin >> input;

  if (input.length() < 3) {
    std::cout << 0 << std::endl;
    return 0;
  }

  for (int i=0; i<3; i++) {
    char c = input[i];
    bool sam_st = isSam(c);
    sam_list.push_back(sam_st);
    sc += sam_st ? 1 : 0;
    oc += sam_st ? 0 : 1;
  }

  ll total = 0;
  ll start = 0;
  ll current_pos = 0;

  if (sc == 3 || oc == 3) {
    total += generateScore(start, current_pos, input.length());
    start = current_pos + 1;
  }

  for (int i = 3; i < input.length(); i++) {
    bool former_head = sam_list.front();
    sam_list.pop_front();
    char c = input[i];
    bool sam_st = isSam(c);
    sam_list.push_back(sam_st);
    sc -= former_head ? 1 : 0;
    oc -= former_head ? 0 : 1;
    sc += sam_st ? 1 : 0;
    oc += sam_st ? 0 : 1;
    if (sc == 3 || oc == 3) {
      current_pos = i - 2;
      total += generateScore(start, current_pos, input.length());
      start = current_pos + 1;
    }
  }

  std::cout << total << std::endl;

  return 0;
}