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++14 (GCC 5.4.1) (judge verdict: Wrong Answer)

#include <bits/stdc++.h>

using namespace std;
using ll =long long;

#define SORT(a) sort((a).begin(),(a).end())
#define rSORT(a) reverse((a).begin(),(a).end())
#define For(i, a, b)    for(int i = (a) ; i < (b) ; ++i)
#define rep(i, n)       For(i, 0, n)
#define debug(x)  cerr << #x << " = " << (x) << endl;
template<class T> inline bool chmin(T& a, T b) { if (a > b) { a = b; return true; } return false; }
template<class T> inline bool chmax(T& a, T b) { if (a < b) { a = b; return true; } return false; }
bool coY() {cout <<"Yes"<<endl;}
bool coN(){cout <<"No"<<endl;}

const ll INF = 1LL << 60;

ll n,m;
string s;
//Write From this Line

const int mod = 1e9+7;
int main()
{
	cin >> s ; 
	string T = s ;
	rSORT(T);
	if(s==T){
		cout << 0 << endl;
		return 0;
	}
	n = s.size(); 
	int X = 0 ;
	int count = 0 ; 
	bool flag = false ;
	map<char,int> MAP;
	int sol = 0 ;
	for( int i = 0 ; i < n ; i ++ ) {
		char c = s[i];
		count ++ ;
		if(c != 'x'){
			MAP[c] ++ ; 
			if(MAP[c] == 2){
				MAP[c] = 0 ;
				flag = false; 
			}
			if( flag ) {
				cout << -1 << endl;
				return 0 ;
			}
			if(MAP[c] == 1){
				flag = true; 
				sol = i;
			}
		} 
		//なんかをしたら次
		count ++ ;
		if(count > n){
			break; 
		}
		c = s[n-1 - i];
		if(c != 'x'){
			MAP[c] ++ ; 
			if(MAP[c] == 2){
				MAP[c] = 0 ;
				flag = false; 
			}
			if( flag ) {
				cout << -1 << endl;
				return 0 ;
			}
			if(MAP[c] == 1){
				flag = true; 
				sol = n - 1 - i ;
			}
		}
	}
	rep(i,n){
		char c = s[i];
		if(c == 'x'){
			if(s[n-1 - i] != 'x'){
				X ++  ;
			}
		}
	}
	//solより前のxと,solよりあとのxの数を数えてみよう
	int bef = 0 ;
	rep(i,sol){
		if(s[i] == 'x') bef ++ ;
	}
	int aft = 0 ;
	for(int i = sol + 1 ; i < n ; i ++ ){
		if(s[i] == 'x') aft ++ ;
	}
	//孤立（真ん中に持ってくる文字）絡みて、同じ距離にあるxの数を数えてみよう
	int same = 0 ; 
	int t = 1 ;
	while(1){
		int i = sol + t ;
		if(i < 0 || i >= n) break;
		if(s[i] == 'x'){
			if(sol - t < 0) break ;
			if(s[sol - t ] == 'x'){
				same ++ ; 
			}
		}
		t ++ ;
	}
	cout << bef + aft - 2*same << endl;
}