#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ull = unsigned long long;
using ld = long double;
using u32 = uint32_t;
using vi = vector<int>;    using vvi = vector<vi>;
using vb = vector<bool>;   using vvb = vector<vb>;
using vl = vector<ll>;     using vvl = vector<vl>;
using vd = vector<double>; using vvd = vector<vd>;

#define MAXC(c, x) (c = max(c, x))
#define MINC(c, x) (c = min(c, x))

#define REP(i,n) for(auto i = 0 * (n), i##_len = (n); i < i##_len; ++i)
#define ALL(c) (c).begin(), (c).end()
#define FOR(i,s,n) for(ll i=s, i##_len=(ll)(n); i<i##_len; ++i)
#define TEN(x) ((ll)1e##x)
const ll mod = TEN(9) + 7;

const ll INF = 1e9;

// Segment Tree : 時間計算量 O(n log n), 空間計算量 O(n)
// require  : なし
// verified : 
//
// T はモノイド（単位元を持ち，結合則が成り立つ）であることが要求される
template <class T, class U = size_t>
struct SegTree {
	// !!! 実装時 t(lhs, rhs) の引数の順番に注意(意図せず可換則が要求されてしまう) !!!
	typedef typename T::V V;
	explicit SegTree(U _n = 0, const T &t = T()) : n(1), t(t) {
		while (n < _n) n *= 2;
		v.assign(n * 2 - 1, t.identity());
		if (n >= 2) {
			for (U i = n - 2;; --i) {
				v[i] = t(v[i * 2 + 1], v[i * 2 + 2]);
				if (i == 0) break; // Uが符号無し整数の可能性がある為こう実装している
			}
		}
	}
	V operator[](U i) const { return v[n - 1 + i]; }
	void set(U i, const V & x) {
		i += n - 1;
		v[i] = x;
		while (i > 0) {
			i = (i - 1) / 2;
			v[i] = t(v[i * 2 + 1], v[i * 2 + 2]);
		}
	}
	// [a,b)の範囲についてのクエリを返す
	V get(U a, U b) const { return q(a, b, 0, 0, n); }
private:
	// t : traits のインスタンス
	// v : 完全二分木の配列表現
	// n : 完全二分木の葉の数
	T t;
	vector<V> v;
	U n;

	// [a,b)の範囲についてのクエリを返す
	// k     : 現在見ている接点の番号
	// [l,r) : kに対応した範囲 
	V q(U a, U b, U k, U l, U r) const {
		if (r <= a || b <= l) return t.identity(); // 範囲外
		if (a <= l && r <= b) return v[k];         // [l,r) ⊂ [a,b)

												   //[l,r)の一部が[a,b)に含まれる
		U c = (l + r) / 2;
		return t(
			q(a, b, k * 2 + 1, l, c),
			q(a, b, k * 2 + 2, c, r)
		);
	}
};

template <class T>
struct SumTrait {
	typedef T V;
	V identity() const { return 0; }
	V operator()(const V &a, const V &b) const { return a + b; }
};


int main() {
	#ifdef INPUT_FROM_FILE
	ifstream cin("sample.in");
	ofstream cout("sample.out");
	#endif
	cin.tie(0);
	ios_base::sync_with_stdio(false);
	cout << fixed << setprecision(50);
	string s; cin >> s;

	ll cnt = 0;
	string t, u;
	{
		vl alp(26, 0);
		vl app(s.size());
		REP(i, s.size()) {
			app[i] = alp[s[i] - 'a'];
			alp[s[i] - 'a']++;
		}

		ll cntR = 0, cntM = 0, cntL = 0;
		vector<int> p(s.size());
		REP(i, s.size()) {
			ll num = alp[s[i] - 'a'];
			if (num / 2 > app[i]) {
				cnt += cntR + cntM;
				p[i] = cntL;
				cntL++;
			} else if (num - num / 2 <= app[i]) {
				p[i] = s.size() - s.size() / 2 + cntR;
				cntR++;
			} else {
				cnt += cntR;
				p[i] = s.size() / 2;
				cntM++;
			}
		}
		if (s.size() % 2 == 0 && cntM != 0 || s.size() % 2 && cntM > 1) {
			cout << -1 << endl;
			return 0;
		}

		vector<char> sd(s.size());
		REP(i, s.size()) sd[p[i]] = s[i];
		REP(i, s.size()) {
			if (i < s.size() / 2) {
				t.push_back(sd[i]);
			} else if (i >= s.size() - s.size() / 2) {
				u.push_back(sd[i]);
			}
		}
		reverse(ALL(u));
	}

	vvl alp(26);
	REP(i, t.size()) alp[t[i] - 'a'].push_back(i);
	SegTree<SumTrait<ll>> st(t.size());
	vl app(26, 0);
	REP(i, u.size()) {
		ll c = u[i] - 'a';
		cnt += st.get(alp[c][app[c]], t.size());
		st.set(alp[c][app[c]], 1);
		app[c]++;
	}
	cout << cnt << endl;

	return 0;
}


Measured memory_bytes: 4644