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: Wrong Answer)

using System;
using System.Diagnostics;
using System.IO;
using System.Text;
using System.Linq;
using System.Collections.Generic;
using System.Text.RegularExpressions;

class Program
{
    const string Yes = "Yes";
    const string No = "No";
    const char White = '.';
    const char Black = '#';
    const long Mod = 1000000007;

    static void Main(string[] args) {
#if DEBUG
        MyDebugger.Test(process, "../TextFile1.txt");
#else
        object ret = process(new StreamReader(Console.OpenStandardInput()));
        Console.WriteLine(ret);
#endif
    }

    static object process(TextReader input) {
        var s = input.ReadLine();

        var list = new List<char>();
        var co = 0;

        foreach(var c in s) {
            if(c != 'x') list.Add(c);
            else co++;
        }

        for(int i=0; i< list.Count/2; i++) {
            if(list[i] == list[list.Count - i - 1]) {

            } else {
                return -1;
            }
        }

        return co;

        //var s1 = new char[s.Length / 2];
        //var s2 = new char[s.Length / 2];

        //for(int i=0; i< s.Length/2; i++) {
        //    s1[i] = s[i];
        //    s2[i] = s[s.Length - i -1];
        //}

        //Func<int, char> f1 = (i) => {
        //    if(i < s1.Length) return s1[i];
        //    else return (char)0;
        //};
        //Func<int, char> f2 = (i) => {
        //    if (i < s2.Length) return s2[i];
        //    else return (char)0;
        //};


        //int i1 = 0;
        //int i2 = 0;

        //while (true) {
        //    var c1 = f1(i1);
        //    var c2 = f2(i2);

        //    if(c1 == c2) {
        //        i1++;
        //        i2++;
        //    }else if(c1 == 'x') {
        //        i1++;
        //    }else if(c2 == 'x') {
        //        i2++;
        //    } else {

        //    }
        //}
    }

    static int[] ToIntArray(string strs, int n) {
        var ret = new int[n];
        var spl = strs.Split(' ');
        for (int i = 0; i < n; i++)
            ret[i] = int.Parse(spl[i]);
        return ret;
    }
}