#include <bits/stdc++.h>
using namespace std;
const int MAXN = 100005;
int ps[MAXN][26];
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
string s;
if (!(cin >> s)) return 0;
int n = s.length();
// Xây dựng mảng prefix sum ps[i][c]
// ps[i][c] lưu số lượng ký tự c từ đầu xâu đến vị trí i - 1
for (int i = 0; i < n; ++i) {
for (int c = 0; c < 26; ++c) {
ps[i + 1][c] = ps[i][c];
}
ps[i + 1][s[i] - 'a']++;
}
long long ans = 0;
// Duyệt qua từng điểm bắt đầu l
for (int l = 0; l < n; ++l) {
// r chạy sao cho độ dài (r - l + 1) luôn chẵn (r - l lẻ, tức là r bắt đầu từ l + 1 và nhảy 2 bước)
for (int r = l + 1; r < n; r += 2) {
int mid = l + (r - l) / 2;
bool ok = true;
// Kiểm tra các ký tự từ 'a' đến 'z'
for (int c = 0; c < 26; ++c) {
int count_left = ps[mid + 1][c] - ps[l][c]; // Số lượng c ở nửa trái [l, mid]
int count_right = ps[r + 1][c] - ps[mid + 1][c]; // Số lượng c ở nửa phải [mid + 1, r]
// Điều kiện: Ký tự xuất hiện ở nửa trái phải tương đương với nửa phải
if ((count_left > 0) != (count_right > 0)) {
ok = false;
break;
}
}
if (ok) {
ans++;
}
}
}
cout << ans << "\n";
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgpjb25zdCBpbnQgTUFYTiA9IDEwMDAwNTsKaW50IHBzW01BWE5dWzI2XTsKCmludCBtYWluKCkgewogICAgaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7CiAgICBjaW4udGllKE5VTEwpOwoKICAgIHN0cmluZyBzOwogICAgaWYgKCEoY2luID4+IHMpKSByZXR1cm4gMDsKICAgIGludCBuID0gcy5sZW5ndGgoKTsKCiAgICAvLyBYw6J5IGThu7FuZyBt4bqjbmcgcHJlZml4IHN1bSBwc1tpXVtjXQogICAgLy8gcHNbaV1bY10gbMawdSBz4buRIGzGsOG7o25nIGvDvSB04buxIGMgdOG7qyDEkeG6p3UgeMOidSDEkeG6v24gduG7iyB0csOtIGkgLSAxCiAgICBmb3IgKGludCBpID0gMDsgaSA8IG47ICsraSkgewogICAgICAgIGZvciAoaW50IGMgPSAwOyBjIDwgMjY7ICsrYykgewogICAgICAgICAgICBwc1tpICsgMV1bY10gPSBwc1tpXVtjXTsKICAgICAgICB9CiAgICAgICAgcHNbaSArIDFdW3NbaV0gLSAnYSddKys7CiAgICB9CgogICAgbG9uZyBsb25nIGFucyA9IDA7CgogICAgLy8gRHV54buHdCBxdWEgdOG7q25nIMSRaeG7g20gYuG6r3QgxJHhuqd1IGwKICAgIGZvciAoaW50IGwgPSAwOyBsIDwgbjsgKytsKSB7CiAgICAgICAgLy8gciBjaOG6oXkgc2FvIGNobyDEkeG7mSBkw6BpIChyIC0gbCArIDEpIGx1w7RuIGNo4bq1biAociAtIGwgbOG6uywgdOG7qWMgbMOgIHIgYuG6r3QgxJHhuqd1IHThu6sgbCArIDEgdsOgIG5o4bqjeSAyIGLGsOG7m2MpCiAgICAgICAgZm9yIChpbnQgciA9IGwgKyAxOyByIDwgbjsgciArPSAyKSB7CiAgICAgICAgICAgIGludCBtaWQgPSBsICsgKHIgLSBsKSAvIDI7CiAgICAgICAgICAgIGJvb2wgb2sgPSB0cnVlOwoKICAgICAgICAgICAgLy8gS2nhu4NtIHRyYSBjw6FjIGvDvSB04buxIHThu6sgJ2EnIMSR4bq/biAneicKICAgICAgICAgICAgZm9yIChpbnQgYyA9IDA7IGMgPCAyNjsgKytjKSB7CiAgICAgICAgICAgICAgICBpbnQgY291bnRfbGVmdCA9IHBzW21pZCArIDFdW2NdIC0gcHNbbF1bY107ICAgICAgIC8vIFPhu5EgbMaw4bujbmcgYyDhu58gbuG7rWEgdHLDoWkgW2wsIG1pZF0KICAgICAgICAgICAgICAgIGludCBjb3VudF9yaWdodCA9IHBzW3IgKyAxXVtjXSAtIHBzW21pZCArIDFdW2NdOyAgIC8vIFPhu5EgbMaw4bujbmcgYyDhu58gbuG7rWEgcGjhuqNpIFttaWQgKyAxLCByXQoKICAgICAgICAgICAgICAgIC8vIMSQaeG7gXUga2nhu4duOiBLw70gdOG7sSB4deG6pXQgaGnhu4duIOG7nyBu4butYSB0csOhaSBwaOG6o2kgdMawxqFuZyDEkcawxqFuZyB24bubaSBu4butYSBwaOG6o2kKICAgICAgICAgICAgICAgIGlmICgoY291bnRfbGVmdCA+IDApICE9IChjb3VudF9yaWdodCA+IDApKSB7CiAgICAgICAgICAgICAgICAgICAgb2sgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKG9rKSB7CiAgICAgICAgICAgICAgICBhbnMrKzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBjb3V0IDw8IGFucyA8PCAiXG4iOwogICAgcmV0dXJuIDA7Cn0=