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
#include <stdio.h>
#include <string.h>

void mapLettersToZerosAndOnes(char* buf, const int length)
{
    for (int i = 0; i < length; ++i) {
        buf[i] = buf[i] == 'a' || buf[i] == 'e' || buf[i] == 'i' || buf[i] == 'o' || buf[i] == 'u' || buf[i] == 'y';
    }
}

long long int count(const long long int length, const long long int beginningOfLastThree, const long long int from, const long long int to)
{
    if (beginningOfLastThree + 1 == from) {
        return length - to;
    } else {
        return (length - to) * (from - beginningOfLastThree);
    }
}

long long int count(const char* buf, const int length)
{
    int zerosCount = (buf[0] == 0) + (buf[1] == 0) + (buf[2] == 0);
    int onesCount = (buf[0] == 1) + (buf[1] == 1) + (buf[2] == 1);
    int beginningOfLastThree = -1;
    long long int result = 0;

    if (zerosCount == 3 || onesCount == 3) {
        result += count(length, beginningOfLastThree, 0, 2);
        beginningOfLastThree = 0;
    }

    for (int i = 3; i < length; ++i) {
        if (buf[i] == 0) {
            zerosCount++;
        } else {
            onesCount++;
        }
        if (buf[i - 3] == 0) {
            zerosCount--;
        } else {
            onesCount--;
        }
        if (zerosCount == 3 || onesCount == 3) {
            result += count(length, beginningOfLastThree, i - 2, i);
            beginningOfLastThree = i - 2;
        }
    }
    return result;
}

int main()
{
    char buf[200010];
    scanf("%s", buf);
    const int length = static_cast<int>(strlen(buf));
    mapLettersToZerosAndOnes(buf, length);
    printf("%lld\n", count(buf, length));
    return 0;
}