#include<bits/stdc++.h>
using namespace std;
const long long MaxN = 1e5 + 5;
string s;
long long nxt[MaxN];
long long first[30], pos[30], last[30];
pair<long long,long long> p[30];
void input()
{
cin >> s;
}
void solve()
{
long long n = s.size();
s = " " + s;
for(long long c=0; c<26; c++)
{
first[c] = n + 1;
last[c] = 0;
}
for(long long i=n; i>=1; i--)
{
long long c = s[i] - 'a';
nxt[i] = first[c];
first[c] = i;
}
for(long long c=0; c<26; c++)
pos[c] = first[c];
long long ans = 0;
for(long long i=1; i<n; i++)
{
long long cur = s[i] - 'a';
last[cur] = i;
if(pos[cur] == i)
pos[cur] = nxt[i];
long long k = min(i,n-i);
long long cnt = 0;
for(long long c=0; c<26; c++)
{
long long lenl = k + 1;
long long lenr = k + 1;
if(last[c] != 0)
{
long long len = i - last[c] + 1;
if(len <= k)
lenl = len;
}
if(pos[c] <= n)
{
long long len = pos[c] - i;
if(len <= k)
lenr = len;
}
if(lenl != lenr)
{
p[cnt] = {
min(lenl,lenr),
max(lenl,lenr) - 1
};
cnt++;
}
}
sort(p,p+cnt);
long long cnt2 = 0;
if(cnt > 0)
{
long long l = p[0].first;
long long r = p[0].second;
for(long long j=1; j<cnt; j++)
{
long long newl = p[j].first;
long long newr = p[j].second;
if(newl > r+1)
{
cnt2 += r-l+1;
l = newl;
r = newr;
}
else
r = max(r,newr);
}
cnt2 += r-l+1;
}
ans += k-cnt2;
}
cout << ans;
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
freopen("file.inp", "r", stdin);
freopen("file.out", "w", stdout);
input();
solve();
return 0;
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKY29uc3QgbG9uZyBsb25nIE1heE4gPSAxZTUgKyA1OwoKc3RyaW5nIHM7Cgpsb25nIGxvbmcgbnh0W01heE5dOwpsb25nIGxvbmcgZmlyc3RbMzBdLCBwb3NbMzBdLCBsYXN0WzMwXTsKCnBhaXI8bG9uZyBsb25nLGxvbmcgbG9uZz4gcFszMF07Cgp2b2lkIGlucHV0KCkKewogICAgY2luID4+IHM7Cn0Kdm9pZCBzb2x2ZSgpCnsKICAgIGxvbmcgbG9uZyBuID0gcy5zaXplKCk7CgogICAgcyA9ICIgIiArIHM7CgogICAgZm9yKGxvbmcgbG9uZyBjPTA7IGM8MjY7IGMrKykKICAgIHsKICAgICAgICBmaXJzdFtjXSA9IG4gKyAxOwogICAgICAgIGxhc3RbY10gPSAwOwogICAgfQoKICAgIGZvcihsb25nIGxvbmcgaT1uOyBpPj0xOyBpLS0pCiAgICB7CiAgICAgICAgbG9uZyBsb25nIGMgPSBzW2ldIC0gJ2EnOwoKICAgICAgICBueHRbaV0gPSBmaXJzdFtjXTsKICAgICAgICBmaXJzdFtjXSA9IGk7CiAgICB9CgogICAgZm9yKGxvbmcgbG9uZyBjPTA7IGM8MjY7IGMrKykKICAgICAgICBwb3NbY10gPSBmaXJzdFtjXTsKCiAgICBsb25nIGxvbmcgYW5zID0gMDsKCiAgICBmb3IobG9uZyBsb25nIGk9MTsgaTxuOyBpKyspCiAgICB7CiAgICAgICAgbG9uZyBsb25nIGN1ciA9IHNbaV0gLSAnYSc7CgogICAgICAgIGxhc3RbY3VyXSA9IGk7CgogICAgICAgIGlmKHBvc1tjdXJdID09IGkpCiAgICAgICAgICAgIHBvc1tjdXJdID0gbnh0W2ldOwoKICAgICAgICBsb25nIGxvbmcgayA9IG1pbihpLG4taSk7CgogICAgICAgIGxvbmcgbG9uZyBjbnQgPSAwOwoKICAgICAgICBmb3IobG9uZyBsb25nIGM9MDsgYzwyNjsgYysrKQogICAgICAgIHsKICAgICAgICAgICAgbG9uZyBsb25nIGxlbmwgPSBrICsgMTsKICAgICAgICAgICAgbG9uZyBsb25nIGxlbnIgPSBrICsgMTsKCiAgICAgICAgICAgIGlmKGxhc3RbY10gIT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbG9uZyBsb25nIGxlbiA9IGkgLSBsYXN0W2NdICsgMTsKCiAgICAgICAgICAgICAgICBpZihsZW4gPD0gaykKICAgICAgICAgICAgICAgICAgICBsZW5sID0gbGVuOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZihwb3NbY10gPD0gbikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbG9uZyBsb25nIGxlbiA9IHBvc1tjXSAtIGk7CgogICAgICAgICAgICAgICAgaWYobGVuIDw9IGspCiAgICAgICAgICAgICAgICAgICAgbGVuciA9IGxlbjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYobGVubCAhPSBsZW5yKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwW2NudF0gPSB7CiAgICAgICAgICAgICAgICAgICAgbWluKGxlbmwsbGVuciksCiAgICAgICAgICAgICAgICAgICAgbWF4KGxlbmwsbGVucikgLSAxCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIGNudCsrOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBzb3J0KHAscCtjbnQpOwoKICAgICAgICBsb25nIGxvbmcgY250MiA9IDA7CgogICAgICAgIGlmKGNudCA+IDApCiAgICAgICAgewogICAgICAgICAgICBsb25nIGxvbmcgbCA9IHBbMF0uZmlyc3Q7CiAgICAgICAgICAgIGxvbmcgbG9uZyByID0gcFswXS5zZWNvbmQ7CgogICAgICAgICAgICBmb3IobG9uZyBsb25nIGo9MTsgajxjbnQ7IGorKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbG9uZyBsb25nIG5ld2wgPSBwW2pdLmZpcnN0OwogICAgICAgICAgICAgICAgbG9uZyBsb25nIG5ld3IgPSBwW2pdLnNlY29uZDsKCiAgICAgICAgICAgICAgICBpZihuZXdsID4gcisxKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNudDIgKz0gci1sKzE7CgogICAgICAgICAgICAgICAgICAgIGwgPSBuZXdsOwogICAgICAgICAgICAgICAgICAgIHIgPSBuZXdyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHIgPSBtYXgocixuZXdyKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgY250MiArPSByLWwrMTsKICAgICAgICB9CgogICAgICAgIGFucyArPSBrLWNudDI7CiAgICB9CgogICAgY291dCA8PCBhbnM7Cn0KaW50IG1haW4oKQp7CiAgICBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKDApOwogICAgY2luLnRpZSgwKTsKICAgIGZyZW9wZW4oImZpbGUuaW5wIiwgInIiLCBzdGRpbik7CiAgICBmcmVvcGVuKCJmaWxlLm91dCIsICJ3Iiwgc3Rkb3V0KTsKICAgIGlucHV0KCk7CiAgICBzb2x2ZSgpOwoKICAgIHJldHVybiAwOwp9Cg==