#include<iostream>
#include<cmath>
#include<algorithm>
#include<iomanip>
#include<climits>
#include<numeric>
#include<set>
#include<sstream>
#include<map>
#include<vector>
#include<string>
#include<regex>
using namespace std;
const long long MOD = (long long)(1e9 + 7);
vector<string> split(const string& haystack, const string& needle) {
vector<string> result;
size_t start_pos = 0;
size_t found_pos = haystack.find(needle, start_pos);
while (found_pos != string::npos) {
size_t count = found_pos - start_pos;
string token = haystack.substr(start_pos, count);
if (!token.empty()) {
result.push_back(token);
}
start_pos = found_pos + needle.length();
found_pos = haystack.find(needle, start_pos);
}
string last_token = haystack.substr(start_pos);
if (!last_token.empty()) {
result.push_back(last_token);
}
return result;
}
string make_key(int x, int y, int z) {
stringstream builder;
builder << x << "-" << y << "-" << z;
return builder.str();
}
int main() {
string s;cin >> s;
map<string, int> prefix;
int d2 = 0, d8 = 0, dt = 0;
int sum = 0;
prefix[make_key(0, 0, 0)] = 1;
for (int i = 0;i < s.length();i++) {
if (s[i] == '2')d2++;
if (s[i] == '8')d8++;
if (s[i] == 't')dt++;
int x = d2 - d8, y = d2 - dt, z = d8 - dt;
string key = make_key(x, y, z);
sum = sum + prefix[key];
prefix[key]++;
}
cout << sum;
return 0;
}
I2luY2x1ZGU8aW9zdHJlYW0+CiNpbmNsdWRlPGNtYXRoPgojaW5jbHVkZTxhbGdvcml0aG0+CiNpbmNsdWRlPGlvbWFuaXA+CiNpbmNsdWRlPGNsaW1pdHM+CiNpbmNsdWRlPG51bWVyaWM+CiNpbmNsdWRlPHNldD4KI2luY2x1ZGU8c3N0cmVhbT4KI2luY2x1ZGU8bWFwPgojaW5jbHVkZTx2ZWN0b3I+CiNpbmNsdWRlPHN0cmluZz4KI2luY2x1ZGU8cmVnZXg+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY29uc3QgbG9uZyBsb25nIE1PRCA9IChsb25nIGxvbmcpKDFlOSArIDcpOwoKdmVjdG9yPHN0cmluZz4gc3BsaXQoY29uc3Qgc3RyaW5nJiBoYXlzdGFjaywgY29uc3Qgc3RyaW5nJiBuZWVkbGUpIHsKCXZlY3RvcjxzdHJpbmc+IHJlc3VsdDsKCXNpemVfdCBzdGFydF9wb3MgPSAwOwoJc2l6ZV90IGZvdW5kX3BvcyA9IGhheXN0YWNrLmZpbmQobmVlZGxlLCBzdGFydF9wb3MpOwoJd2hpbGUgKGZvdW5kX3BvcyAhPSBzdHJpbmc6Om5wb3MpIHsKCQlzaXplX3QgY291bnQgPSBmb3VuZF9wb3MgLSBzdGFydF9wb3M7CgkJc3RyaW5nIHRva2VuID0gaGF5c3RhY2suc3Vic3RyKHN0YXJ0X3BvcywgY291bnQpOwoJCWlmICghdG9rZW4uZW1wdHkoKSkgewoJCQlyZXN1bHQucHVzaF9iYWNrKHRva2VuKTsKCQl9CgkJc3RhcnRfcG9zID0gZm91bmRfcG9zICsgbmVlZGxlLmxlbmd0aCgpOwoJCWZvdW5kX3BvcyA9IGhheXN0YWNrLmZpbmQobmVlZGxlLCBzdGFydF9wb3MpOwoJfQoKCXN0cmluZyBsYXN0X3Rva2VuID0gaGF5c3RhY2suc3Vic3RyKHN0YXJ0X3Bvcyk7CglpZiAoIWxhc3RfdG9rZW4uZW1wdHkoKSkgewoJCXJlc3VsdC5wdXNoX2JhY2sobGFzdF90b2tlbik7Cgl9CglyZXR1cm4gcmVzdWx0Owp9CnN0cmluZyBtYWtlX2tleShpbnQgeCwgaW50IHksIGludCB6KSB7CglzdHJpbmdzdHJlYW0gYnVpbGRlcjsKCWJ1aWxkZXIgPDwgeCA8PCAiLSIgPDwgeSA8PCAiLSIgPDwgejsKCXJldHVybiBidWlsZGVyLnN0cigpOwp9CmludCBtYWluKCkgewoJc3RyaW5nIHM7Y2luID4+IHM7CgltYXA8c3RyaW5nLCBpbnQ+IHByZWZpeDsKCWludCBkMiA9IDAsIGQ4ID0gMCwgZHQgPSAwOwoJaW50IHN1bSA9IDA7CglwcmVmaXhbbWFrZV9rZXkoMCwgMCwgMCldID0gMTsKCWZvciAoaW50IGkgPSAwO2kgPCBzLmxlbmd0aCgpO2krKykgewoJCWlmIChzW2ldID09ICcyJylkMisrOwoJCWlmIChzW2ldID09ICc4JylkOCsrOwoJCWlmIChzW2ldID09ICd0JylkdCsrOwoKCQlpbnQgeCA9IGQyIC0gZDgsIHkgPSBkMiAtIGR0LCB6ID0gZDggLSBkdDsKCQlzdHJpbmcga2V5ID0gbWFrZV9rZXkoeCwgeSwgeik7CgkJc3VtID0gc3VtICsgcHJlZml4W2tleV07CgkJcHJlZml4W2tleV0rKzsKCX0KCWNvdXQgPDwgc3VtOwoJcmV0dXJuIDA7Cn0K