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 <map>
#include <algorithm>
#include <cassert>
#include <climits>
#include <complex>
#include <cstdio>
#include <string>
#include <iostream>
#include <queue>
#include <string>
#include <tuple>
#include <vector>
using namespace std;
using ll = long long;
using ld = long double;
template <typename T> T &chmin(T &a, const T &b) { return a = min(a, b); }
template <typename T> T &chmax(T &a, const T &b) { return a = max(a, b); }
#define all(a) (a).begin(), (a).end()
#define FOR(i,x,y) for(int i=(x);i<(int)(y);i++)
#define FORP(i,x,y) for(int i=(x);i<=(int)(y);i++)
#define REP(i,y) for(int i=0;i<(int)(y);i++)
#define REPP(i,y) for(int i=1;i<=(int)(y);i++)
#define REPB(i,n) for(int i=(int)(n)-1;i>=0;i--)
#define DEBUG(X) cerr<<__LINE__<<" "<<#X<<": "<<X<<endl;


int main() {
  string s; cin>>s;
  int n=(int)s.length();

  string t(s);
  reverse(all(t));
  if (s==t) {
    cout << "0" << endl;
    return 0;
  }

  vector<char> p; vector<int> q;
  int cnt=0;
  for (int i=0; i<n; i++) {
    if (s[i]!='x') {
      p.push_back(s[i]);
      q.push_back(i);
    }
    else cnt++;
  }

  vector<char> rp(p);
  reverse(all(rp));
  if (p!=rp) {
    cout << -1 << endl;
    return 0;
  }

  int mid;
  if (p.size()%2==0) {
    int midl = q[p.size()/2-1];
    int midr = q[p.size()/2];
    mid = (midl + midr) / 2;
  } else if (p.size()%2==1) {
    mid = q[p.size()/2-1];
    // DEBUG(mid);
    // DEBUG(n);
    cout << abs((n-1-mid) - mid) << endl;
  }
  string ls = s.substr(mid);
  string rs = s.substr(0, mid);
  int lcnt = 0, rcnt = 0;
  int ans = 0, sum=0;
  while (sum<n) {
    if (ls[lcnt] == rs[rcnt]) {
      lcnt++, rcnt++;
      sum+=2;
    }
    else if (ls[lcnt]=='x') {
      lcnt++, ans++;
      sum++;
    }
    else if (rs[rcnt]=='x') {
      rcnt++, ans++;
      sum++;
    }
  }
  cout << ans << endl;
  return 0;
}