#include <bits/stdc++.h>
    #include<string.h>
    using namespace std;
    #define IOS ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    #define endl "\n"
    #define Max(x,y,z) max(x,max(y,z))
    #define Min(x,y,z) min(x,min(y,z))
    #define fr(i,s,e) for(i=s;i<e;i++)
    #define rf(i,s,e) for(i=s-1;i>=e;i--)
    #define pb push_back
    #define eb emblace_back
    #define mp make_pair
    #define ff first
    #define ss second
    #define ll long long
    #define trace1(x)                cerr<<#x<<": "<<x<<endl
    #define trace2(x, y)             cerr<<#x<<": "<<x<<" | "<<#y<<": "<<y<<endl
    #define trace3(x, y, z)          cerr<<#x<<":" <<x<<" | "<<#y<<": "<<y<<" | "<<#z<<": "<<z<<endl
    #define trace4(a, b, c, d)       cerr<<#a<<": "<<a<<" | "<<#b<<": "<<b<<" | "<<#c<<": "<<c<<" | "<<#d<<": "<<d<<endl
    #define trace5(a, b, c, d, e)    cerr<<#a<<": "<<a<<" | "<<#b<<": "<<b<<" | "<<#c<<": "<<c<<" | "<<#d<<": "<<d<<" | "<<#e<< ": "<<e<<endl
    #define trace6(a, b, c, d, e, f) cerr<<#a<<": "<<a<<" | "<<#b<<": "<<b<<" | "<<#c<<": "<<c<<" | "<<#d<<": "<<d<<" | "<<#e<< ": "<<e<<" | "<<#f<<": "<<f<<endl
    #define vl vector<long long>
     
    #define vi vector<int> 
    #define vii vector< vector<int> >
    #define vll vector< vector<long long> >
    #define vpi vector< pair<int,int> >   
    #define vpl vector< pair<ll,ll> >   
    typedef pair<pair<int, ll>,int> P;
     #define mod %1000000007
     #define p 41
    bool less_vectors(const vector<int>& a,const vector<int>& b) 
    {
       return a.size() > b.size();
    }
     
    ll gcd(ll a,ll b)
	{
	if(a%b==0)
		return b;
		else
			return gcd(b,a%b);
	}
	class compr
	{
		public:
	bool operator()(pair<pair<int,ll>,int>  p1,pair<pair<int,ll>,int> p2)
    {
		if(p1.ff.ss!=p2.ff.ss)
			return p1.ff.ss>p2.ff.ss;
			else
				if(p1.ss!=p2.ss)
				return p1.ss>p2.ss;
				else
					return p1.ff<p2.ff;
				
    }
	
	};
	ll fastexpo(ll a,ll b)
	{
		//trace2(a,b);
    	ll res=1;
    	while(b>0)
    	{
    		if(b%2==1)
    			res=(((res)mod)*((a)mod))mod;
    		a=(((a)mod)*((a)mod))mod;
    		b/=2;
    	}
		//trace1(res);
    	return res;
	}
	ll fastexpom(ll a,ll b,ll m)
	{
	ll res=1;
    	while(b>0)
    	{
    		if(b%2==1)
    			res=(((res)%m)*((a)%m))%m;
    		a=(((a)%m)*((a)%m))%m;
    		b/=2;
    	}
    	return res;
	}
	ll modinv(ll a,ll m=1000000007)
	{
	return fastexpom(a,m-2,m);
	}
vii g;
vi a;
vi vis;
int ld=-1;
int id=1e7;;
void dfs(int s,int c)
{
	if(c>ld && a[s])
	{
		ld=c;
		id=s;
	}
	if(c==ld && a[s])
	{
		if(s<id)
			id=s;
	}
	vi::iterator it=g[s].begin();
	for(;it!=g[s].end();it++)
	{
		if(!vis[*it])
		{
			vis[*it]=1;
			dfs(*it,c+1);
		}
	}
}
vi d;
bool dfs1(int s,int c)
{
	
	if(c==ld && a[s])
	{
		d[s]=1;
		//trace5(s,c,ld,a[s],d[s]);
		return 1;
	}
	vi::iterator it=g[s].begin();
	for(;it!=g[s].end();it++)
	{
		if(!vis[*it])
		{
			vis[*it]=1;
			bool k=dfs1(*it,c+1);
			if(k==1)
			{
				d[s]=1;
				//trace1(s);
				return 1;
			}
		}
	}
	return 0;
}
ll ans=0;
ll dfs2(int s)
{
	ll k=0;
	
	vi::iterator it=g[s].begin();
	for(;it!=g[s].end();it++)
	{
		if(!vis[*it])
		{
			vis[*it]=1;
			k+=dfs2(*it);
			
		}
	}
	//trace5(s,d[s],a[s],k,ans);
	if(d[s])
	{
		ans+=2*k;
		return 0;
	}
	else
	{
		if(k!=0)
			return k+1;
			else
				if(a[s])
					return 1;
					else
						return 0;
	}
	
}

int main()
{
	IOS;
	string s;// Transform S to T
	cin>>s;
	ll n=s.length();
	ll ans=((n)*(n+1))/2-n;
	for(int i=0;i<26;i++)
	{
		ll cnt=0;
		for(int j=0;j<s.length();j++)
		{
			if(s[j]==char(i+97))
			{
				ans-=cnt;
				cnt++;
			}
			
				
		}
	}
	cout<<ans+1;
	return 0;
}  

Measured memory_bytes: 720