Problem:
Score : 500 points

Problem Statement

You have a string A = A_1 A_2 ... A_n consisting of lowercase English letters.

You can choose any two indices i and j such that 1 \leq i \leq j \leq n and reverse substring A_i A_{i+1} ... A_j.

You can perform this operation at most once.

How many different strings can you obtain?

Constraints

1 \leq |A| \leq 200,000

A consists of lowercase English letters.

Input

Input is given from Standard Input in the following format:

A

Output

Print the number of different strings you can obtain by reversing any substring in A at most once.

Sample Input 1

aatt

Sample Output 1

5

You can obtain aatt (don't do anything), atat (reverse A[2..3]), atta (reverse A[2..4]), ttaa (reverse A[1..4]) and taat (reverse A[1..3]).

Sample Input 2

xxxxxxxxxx

Sample Output 2

1

Whatever substring you reverse, you'll always get xxxxxxxxxx.

Sample Input 3

abracadabra

Sample Output 3

44

Solution in C# (Mono 4.6.2.0) (judge verdict: Accepted)

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;

class TEST{
	static void Main(){
		Sol mySol =new Sol();
		mySol.Solve();
	}
}

class Sol{
	public void Solve(){
		
		int N = S.Length;
		int[] cnt = new int[26];
		for(int i=0;i<N;i++){
			cnt[S[i] - 'a']++;
		}
		
		long ans = 0;
		for(int i=0;i<26;i++){
			for(int j=i+1;j<26;j++){
				ans += (long)cnt[i] * (long) cnt[j];
			}
		}
		Console.WriteLine(ans+1);
	}
	
	String S;
	public Sol(){
		S = rs();
	}
	
	int[] Manachar(List<char> L){
		int[] Ret=new int[L.Count];
		int i=0;
		int j=0;
		while(i<L.Count){
			while(i-j>=0 && i+j <L.Count && L[i-j]==L[i+j])++j;
			Ret[i]=j;
			int k=1;
			while(i-k>=0 && i+k <L.Count && k+Ret[i-k]<j){Ret[i+k]=Ret[i-k];++k;}
			i+=k;j-=k;
		}
		return Ret;
	}
	

	static String rs(){return Console.ReadLine();}
	static int ri(){return int.Parse(Console.ReadLine());}
	static long rl(){return long.Parse(Console.ReadLine());}
	static double rd(){return double.Parse(Console.ReadLine());}
	static String[] rsa(char sep=' '){return Console.ReadLine().Split(sep);}
	static int[] ria(char sep=' '){return Array.ConvertAll(Console.ReadLine().Split(sep),e=>int.Parse(e));}
	static long[] rla(char sep=' '){return Array.ConvertAll(Console.ReadLine().Split(sep),e=>long.Parse(e));}
	static double[] rda(char sep=' '){return Array.ConvertAll(Console.ReadLine().Split(sep),e=>double.Parse(e));}
}