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: Accepted)

#include <bits/stdc++.h>
#include <iomanip>

using namespace std;

typedef long long LL;
typedef long double LD;
typedef pair<int, int> PII;
typedef pair<LL, LL> PLL;
typedef pair<LD, LD> PLDLD;
typedef vector<int> VI;
typedef vector<char> VB;

#define FOR(i,a,b) for(int i=(a);i<(int)(b);++i)
#define REP(i,n)  FOR(i,0,n)
#define CLR(a) memset((a), 0 ,sizeof(a))
#define ALL(a) a.begin(),a.end()

const double eps=1e-5;
const long long INF=(LL)(1e9)*(LL)(1e9);

template<class T>
void chmin(T& a, const T& b)
{
	if(a>b)
		a=b;
}
template<class T>
void chmax(T& a, const T& b)
{
	if(a<b)
		a=b;
}

const LL pow(const LL p, const LL q)
{
	LL t=1;
	REP(i,q)
		t*=p;
	return t;
}


int main()
{
	cin.tie(0);
	ios::sync_with_stdio(false);

	string ss;
	cin>>ss;
	/*
	string s="";
	REP(i,ss.size())
	{
		if(ss[i]=='x')
			continue;
		s+=string{ss[i]};
	}

	REP(i,s.size()/2)
	{
		if(s[i]!=s[s.size()-i-1])
		{
			cout<<-1<<endl;
			return 0;
		}
	}*/

	int ans=0;
	int l=0,r=ss.size()-1;
	while(1)
	{
		if(l>=r) break;
		while(ss[l]=='x'&&ss[r]=='x')
		{
			l++;r--;
			if(l>=r) break;
		}
		if(l>=r) break;

		while(ss[l]=='x')
		{
			l++;
			ans++;
		}
		while(ss[r]=='x')
		{	
			r--;
			ans++;
		}
		if(ss[l]!=ss[r])
		{
			cout<<-1<<endl;
			return 0;
		}
		l++;
		r--;
	}
	cout<<ans<<endl;
}