//string f(string s){
//    for(char &c : s)
//        c += 'a';
//    return s;
//}
//const int N = 2e5+5;
//int ftree[N];
//int fget(int x){
//    int ans = 0;
//    for(int i = x; i > 0; i-=i&(-i))
//        ans += ftree[i];
//    return ans;
//}
//void fadd(int x){
//    for(int i = x; i < N; i+=i&(-i))
//        ftree[i]++;
//}
//void __(){
//    _(string,s);
//    vi cnt(26);
//    for(char &c : s){
//        c -= 'a';
//        ++cnt[c];
//    }
//    int cnt_mid = 0;
//    rep(i,26)
//        if(cnt[i]%2)
//            ++cnt_mid;
//    if(cnt_mid > sz(s)%2){
//        print -1;
//        return;
//    }
//    int zeros = 0;
//    ll ans = 0;
//    vi got(26);
//    string ls;
//    string rs;
//    rep(i,sz(s)){
//        if((got[s[i]]+1)*2 <= cnt[s[i]]){
//            ans += zeros;
//            ls.pb(s[i]);
//            ++got[s[i]];
//        }
//        else{
//            zeros += 1;
//            rs.pb(s[i]);
//        }
//    }
//    reverse(all(ls));
//    vvi pos_of(26);
//    per(i,sz(ls))
//        pos_of[ls[i]].pb(i);
//    if(sz(s)%2){
//        int l = 0;
//        while(cnt[rs[l]]%2 == 0)
//            ++l;
//        ans += l;
//        rs.erase(rs.begin()+l);
//    }
//    vi arr;
//    rep(i,sz(rs)){
//        arr.pb(pos_of[rs[i]].back()+2);
//        pos_of[rs[i]].pop_back();
//    }
//    reverse(all(arr));
//    for(int x : arr){
//        ans += fget(x);
//        fadd(x);
//    }
//    print ans;
//}
//
#include <iomanip>
#include <algorithm>
#include <vector>
#include <utility>
#include <iostream>
#include <string>
#define pb push_back
#define REP_ZERO_INT(i,r) for(int i = 0; i < r; ++i)
#define GET_REP_MACRO(_1,_2,_3,_4,NAME,...) NAME
#define rep(...) GET_REP_MACRO(__VA_ARGS__,REP_ANY,REP_INT,REP_ZERO_INT)(__VA_ARGS__)
#define PER_ZERO_INT(i,r) for(int i = r-1; i >= 0; --i)
#define GET_PER_MACRO(_1,_2,_3,_4,NAME,...) NAME
#define per(...) GET_PER_MACRO(__VA_ARGS__,PER_ANY,PER_INT,PER_ZERO_INT)(__VA_ARGS__)
#define all(v) (v).begin(), (v).end()
#define sz(v) ll(v.size())
#define T1 template<typename T> static
using namespace std;
typedef long long ll;
typedef vector<int> vi;
typedef vector<vi> vvi;
T1 ostream& operator<<(ostream& stream, const vector<T>& t);
T1 istream& read(T, T, istream& = cin);
struct _print {
    string sep,end;
    bool space;
    ostream &stream;
    _print(string _sep=" ",string _end="\n",
            ostream &_stream = cout)
        : sep(_sep),end(_end),space(false),
            stream(_stream) {}
    ~_print() { stream << end; }
    template <typename T>
        _print &operator , (const T &t) {
            if (space) stream << sep;
            space = true;
            stream << t;
            return *this;
        }
};
#define print _print(),
#define INPUT_WITHOUT_INIT(type,name) type name; cin >> name
#define GET_INPUT_MACRO(_1,_2,_3,_4,_5,_6,_7,_8,NAME,...) NAME
#define _(...) GET_INPUT_MACRO(__VA_ARGS__,_IWI,_IWI,_IWI,_IWI,_IWI,_IWI,INPUT_WITHOUT_INIT)(__VA_ARGS__)
string f(string s){
    for(char &c : s)
        c += 'a';
    return s;
}
const int N = 2e5+5;
int ftree[N];
int fget(int x){
    int ans = 0;
    for(int i = x; i > 0; i-=i&(-i))
        ans += ftree[i];
    return ans;
}
void fadd(int x){
    for(int i = x; i < N; i+=i&(-i))
        ftree[i]++;
}
void __(){
    _(string,s);
    vi cnt(26);
    for(char &c : s){
        c -= 'a';
        ++cnt[c];
    }
    int cnt_mid = 0;
    rep(i,26)
        if(cnt[i]%2)
            ++cnt_mid;
    if(cnt_mid > sz(s)%2){
        print -1;
        return;
    }
    int zeros = 0;
    ll ans = 0;
    vi got(26);
    string ls;
    string rs;
    rep(i,sz(s)){
        if((got[s[i]]+1)*2 <= cnt[s[i]]){
            ans += zeros;
            ls.pb(s[i]);
            ++got[s[i]];
        }
        else{
            zeros += 1;
            rs.pb(s[i]);
        }
    }
    reverse(all(ls));
    vvi pos_of(26);
    per(i,sz(ls))
        pos_of[ls[i]].pb(i);
    if(sz(s)%2){
        int l = 0;
        while(cnt[rs[l]]%2 == 0)
            ++l;
        ans += l;
        rs.erase(rs.begin()+l);
    }
    vi arr;
    rep(i,sz(rs)){
        arr.pb(pos_of[rs[i]].back()+2);
        pos_of[rs[i]].pop_back();
    }
    reverse(all(arr));
    for(int x : arr){
        ans += fget(x);
        fadd(x);
    }
    print ans;
}
int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cout << fixed << setprecision(15);
        __();
}


Measured memory_bytes: 2448