Problem: There is a given string S consisting of N symbols. Your task is to find the number of ordered pairs of integers i and j such that

1. 1 ≤ i, j ≤ N

2. S[i] = S[j], that is the i-th symbol of string S is equal to the j-th.

Input

The single input line contains S, consisting of lowercase Latin letters and digits. It is guaranteed that string S in not empty and its length does not exceed 105.

Output

Print a single number which represents the number of pairs i and j with the needed property. Pairs (x, y) and (y, x) should be considered different, i.e. the ordered pairs count.

Examples

Input

great10


Output

7


Input

aaaaaaaaaa


Output

100

Solution (in JAVA):

Solution:
import java.util.*;

public class Main {
  public static Scanner in = new Scanner(System.in);
  public static boolean[] composite;
  // 50B-ChoosingSymbolPairs
  public static void main(String[] args) {
    // TODO: Start coding here
    HashMap<Character, Integer> counts = new HashMap<Character, Integer>();
    String line = in.nextLine();
    for(int i=0; i<line.length(); ++i) {
      if(counts.containsKey(line.charAt(i))){
        counts.put(line.charAt(i), counts.get(line.charAt(i))+1);
      } else {
        counts.put(line.charAt(i), 1);
      }
    }

    long pairCount = 0;

    for(Map.Entry<Character, Integer> entry : counts.entrySet()) {
      // System.out.println(entry.getKey() + " " + entry.getValue());
      pairCount += nChoose2(entry.getValue());
    }

    System.out.println(pairCount);

    in.close();
  }

  public static long nChoose2(long n) {
    if( n < 1 ) return 0;
    return n * n;
  }

  public static void sieve(int n) {
    composite = new boolean[n+1];
    composite[0] = true;
    composite[1] = true;
    composite[2] = false;
    for(int i=2; i<=n ; ++i) {
      if(composite[i]) continue;

      for(int j=2*i; j<=n; j += i) {
        composite[j] = true;
      }
    }
  }

  public static int maxSubArraySum(int a[]) {
    int maxSoFar = 0;
    int maxEndingHere = 0;

    for(int i=0; i<a.length; ++i) {
      maxEndingHere = maxEndingHere + a[i];
      if( maxSoFar < maxEndingHere ) {
        maxSoFar = maxEndingHere;
      }
      if(maxEndingHere < 0)
        maxEndingHere = 0;
    }

    return maxSoFar;
  }

  public static int[] getIntArray(int n) {
    int[] arr = new int[n];
    for(int i=0; i<n; ++i) {
      arr[i] = in.nextInt();
    }
    return arr;
  }

  public static int min(int ... args) {
    int mi = args[0];
    for(int i=1; i<args.length; ++i) {
      if( mi > args[i] ) {
        mi = args[i];
      }
    }

    return mi;
  }

  public static int max(int ... args) {
    // System.out.println(Arrays.toString(args));
    int mx = args[0];
    for(int i=1; i<args.length; ++i) {
      if( mx < args[i] ) {
        mx = args[i];
      }
    }

    return mx;
  }

}