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: Time Limit Exceeded)

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

class _Class
{
  void _Do()
  {
		//
		var s_ = Split._string()[0];
    var _文字列　= s_.Length;

		//
    var hs = new HashSet<String>();
		hs.Add(s_);

		//
		var left = 0;
		while (true)
		{
			if (left > _文字列)
				break;

      int len = 2;
      while (true)
      {
        if (left + len > _文字列)
          break;

				//
				var sub = s_.Substring(left,len);
				var CharA= sub.ToCharArray();
				Array.Reverse(CharA);
				var rev = new String(CharA);

				//
				var str = 
					s_.Substring(0,left) +
					rev+
					s_.Substring(left+len);

				hs.Add(str);

				len+=1;
			}

			left+=1;
    }
		Console.WriteLine(hs.Count);
  }

	

	static void Main(string[] args)
	{
		new _Class()._Do();
	}
}

//
static class Split
{
	// 1
	public static string[] _string()
	{
		return Console.ReadLine().Split();
	}

	// [2.1] -2,147,483,648 ~ +2,147,483,647
	public static int[] _int()
	{
		var _s = Console.ReadLine().Split();

		var x = new int[_s.Length];
		for (var i = 0; i < _s.Length; i++)
			x[i] = int.Parse(_s[i]);

		return x;
	}

	// [2.2] -9,223,372,036,854,775,808 ~ +9,223,372,036,854,775,807
	public static long[] _long()
	{
		var _s = Console.ReadLine().Split();

		var x = new long[_s.Length];
		for (var i = 0; i < _s.Length; i++)
			x[i] = long.Parse(_s[i]);

		return x;
	}
}