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>
typedef long long ll;
typedef long double ld;
using namespace std;

#define REP(i, l, n) for(int i=(l), i##_len=(n); i<i##_len; ++i)
#define ALL(x) (x).begin(),(x).end()
#define pb push_back

ll gcd(ll a,ll b){return b ? gcd(b,a%b) : a;}
ll lcm(ll a,ll b){return a/gcd(a,b)*b;}

char alpha[26] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'};

int dx[4] = {-1, 1, 0, 0};
int dy[4] = {0, 0, 1, -1};

int main(){
    string s, t = ""; cin >> s;
    REP(i, 0, s.size()){
        if(s[i] != 'x'){
            t = t + s[i];
        }
    }
    int en = t.size()-1;
    REP(i, 0, t.size()/2){
        if(t[i] != t[en-i]){
            cout << -1 << endl;
            return 0;
        }
    }
    vector<int> lis(t.size()+1, 0), lis2(t.size()+1, 0);
    int l = 0;
    REP(i, 0, (t.size()+1)/2){
        int count = 0;
        while(1){
            if(s[l] == t[i]){
                lis[i] = count;
                l++;
                break;
            }else{
                count++;
                l++;
            }
        }
    }
    reverse(ALL(s));
    reverse(ALL(t));
    l = 0;
    REP(i, 0, (t.size()+1)/2){
        int count = 0;
        while(1){
            if(s[l] == t[i]){
                lis2[i] = count;
                l++;
                break;
            }else{
                count++;
                l++;
            }
        }
    }
    ll ans = 0;
    REP(i, 0, lis.size()){
        ans += abs(lis[i] - lis2[i]);
    }
    cout << ans << endl;
}