#include <algorithm>
#include <bitset>
#include <cassert>
#include <chrono>
#include <climits>
#include <cmath>
#include <complex>
#include <cstring>
#include <deque>
#include <functional>
#include <iostream>
#include <list>
#include <map>
#include <numeric>
#include <queue>
#include <random>
#include <set>
#include <stack>
#include <unordered_map>
#include <unordered_set>
#include <vector>
#include <cstdint>
using namespace std;
typedef long long ll;
#define MP make_pair
#define PB push_back
#define inf 1000000007
#define mod 1000000007
#define rep(i,n) for(int i = 0; i < (int)(n); ++i)

template<typename T> class BIT {
private:
	int n;
	vector<T> bit;
public:
	// 0_indexed で i 番目の要素に x を加える
	void add(int i, T x){
		i++;
		while(i < n){
			bit[i] += x, i += i & -i;
		}
	}
	// 0_indexed で [0,i] の要素の和(両閉区間！！)
	T sum(int i){
		i++;
		T s = 0;
		while(i > 0){
			s += bit[i], i -= i & -i;
		}
		return s;
	}
	BIT(){}
	//初期値がすべて0の場合
	BIT(int sz) : n(sz+1), bit(n, 0){}
	BIT(const vector<T>& v) : n((int)v.size()+1), bit(n, 0){
		for(int i = 0; i < n-1; i++){
			add(i,v[i]);
		}
	}
	void print(){
		for(int i = 0; i < n-1; i++){
			cout << sum(i) - sum(i-1) << " ";
		}
		cout << "\n";
	}
	//-1スタート
	void print_sum(){
		for(int i = 0; i < n; i++){
			cout << sum(i-1) << " ";
		}
		cout << "\n";
	}
};

// u を昇順にソートするのに必要な交換回数(転倒数) (u は {0,..., n-1} からなる重複を許した長さ n の数列)
long long inv_count(const vector<int>& u)
{
	int n = (int)u.size();
	BIT<int> bt(n);
	long long ans = 0;
	for(int i = 0; i < n; i++){
		ans += i - bt.sum(u[i]);
		bt.add(u[i], 1);
	}
	return ans;
}

// u を v に変換するのに必要な交換回数(転倒数)
// (u, v は {0,..., n-1} からなる重複を許した長さ n の数列. ただし u, v 全体で各数字の個数は一致するものとする)
long long inv_count(const vector<int>& u, const vector<int>& v)
{
    int n = (int)u.size();
    vector<vector<int> > p(n);
    BIT<int> bt(n);
    for(int i = n-1; i >= 0; --i){
        p[u[i]].push_back(i);
    }
    long long ans = 0;
    for(int i = 0; i < n; ++i){
        int pos = p[v[i]].back();
        p[v[i]].pop_back();
        ans += pos - bt.sum(pos);
        bt.add(pos, 1);
    }
    return ans;
}

int c[26];
int d[26];
int main(){
    string s;
    cin >> s;
    int n = s.size();
    
    map<int,int> mp;
    vector<int>a(n);
    int ddd = 0;
    rep(i,n){
        a[i] = s[i]-'a';
    }
    rep(i,n){
        if(mp.find(a[i])==mp.end()){
            mp[a[i]] = ddd;
            ddd++;
        }
    }
    rep(i,n){
        a[i] = mp[a[i]];
    }
    rep(i,n){
        c[a[i]]++;
    }
    if(n%2==0){
        bool flag = 1;
        rep(i,26){
            if(c[i]%2==1)flag = 0;
        }
        if(flag){
            vector<int> p(n);
            int id = 0;
            for(int i=0;i<n;i++){
                if(d[a[i]]>=c[a[i]]/2){
                    continue;
                }
                d[a[i]]++;
                p[id] = a[i];
                id++;   
            }
            for(int i=n-1;i>=0;i--){
                p[i] = p[n-1-i];
            }
            cout << inv_count(a,p) << endl;
        }else{
            cout << -1 << endl;
        }
    }else{
        bool flag = 1;
        int k = -1;
        rep(i,26){
            if(c[i]%2==1){
                if(k==-1){
                    k = i;
                }else{
                    flag = 0;
                }
            }
        }
        if(flag){
            vector<int> p(n);
            int id = 0;
            for(int i=0;i<n;i++){
                if(d[a[i]]>=c[a[i]]/2){
                    continue;
                }
                d[a[i]]++;
                p[id] = a[i];
                id++;   
            }
            p[id] = k;
            for(int i=n-1;i>=0;i--){
                p[i] = p[n-1-i];
            }
            cout << inv_count(a,p) << endl;
        }else{
            cout << -1 << endl;
        }
    }
    return 0;
}

Measured memory_bytes: 8948