Problem:
Score : 400 points

Problem Statement

We have a string s consisting of lowercase English letters.
Snuke can perform the following operation repeatedly:

Insert a letter x to any position in s of his choice, including the beginning and end of s.

Snuke's objective is to turn s into a palindrome.
Determine whether the objective is achievable. If it is achievable, find the minimum number of operations required.

Notes

A palindrome is a string that reads the same forward and backward.
For example, a, aa, abba and abcba are palindromes, while ab, abab and abcda are not.

Constraints

1 \leq |s| \leq 10^5

s consists of lowercase English letters.

Input

Input is given from Standard Input in the following format:

s

Output

If the objective is achievable, print the number of operations required.
If it is not, print -1 instead.

Sample Input 1

xabxa

Sample Output 1

2

One solution is as follows (newly inserted x are shown in bold):

xabxa → xaxbxa → xaxbxax

Sample Input 2

ab

Sample Output 2

-1

No sequence of operations can turn s into a palindrome.

Sample Input 3

a

Sample Output 3

0

s is a palindrome already at the beginning.

Sample Input 4

oxxx

Sample Output 4

3

One solution is as follows:

oxxx → xoxxx → xxoxxx → xxxoxxx

Solution in C# (Mono 4.6.2.0) (judge verdict: Runtime Error)

using System;
using System.Collections.Generic;
class Program{
	static void Main(){
		string s=Console.ReadLine();
		char c='0';
		int ans=0,a=0,z=0,j=0;
		var hs=new Dictionary<char,int>();
		for(int i=0;i<s.Length;i++){
			if(hs.ContainsKey(s[i])){hs[s[i]]++;a++;}
			else if(s[i]!='x'){hs.Add(s[i],1);a++;}
		}
		foreach(KeyValuePair<char,int> e in hs){
			if(e.Key!='x'&&e.Value%2==1){
				if(c=='0'){c=e.Key;}
				else{ans=-1;goto f;}
			}
		}
		char[] cr=new char[a];
		a=0;
		if(c!='0'){
			for(;z<hs[c]/2+1;j++){
				if(s[j]!='x'){
					cr[a]=s[j];
					a++;
					if(s[j]==c){z++;}
				}
			}
			a=0;
			z=j;
			for(j=s.Length-1;j>=z;j--){
				if(s[j]!='x'){
					if(cr[a]!=s[j]){ans=-1;goto f;}
					a++;
				}
			}
			s="A"+s+"A";
			for(int i=z,k=z;k>-1;i++,k--){
				while(s[i]!=s[k]){
					if(s[i]=='x'){i++;}
					else{k--;}
					ans++;
				}
			}
		}
		else{
			for(int i=0;i<s.Length;i++){
				if(s[i]!='x'){
					cr[a]=s[i];
					a++;
				}
			}
			c=cr[a/2];
			for(int i=a/2,k=a/2-1;k>-1;i++,k--){
				if(cr[i]!=cr[k]){ans=-1;goto f;}
			}
			a=0;
			for(j=0;j<s.Length;j++){
				if(s[j]==c){
					a++;
					if(hs[c]/2==a){break;}
				}
			}
			s="A"+s+"A";
			for(int i=j+2,k=j+1;k>-1;i++,k--){
				while(s[i]!=s[k]){
					if(s[i]=='x'){i++;}
					else{k--;}
					ans++;
				}
			}
		}
		f:
		Console.WriteLine("{0}",ans);
	}
}