#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 1e6 + 5;
int n, cnt;
char s[N];
ll ans;
deque < int > d[30];
struct tree{int x, tag;}tr[N << 2];
void upd(int x){tr[x].x = tr[x << 1].x + tr[x << 1 | 1].x;}
void build(int x, int l, int r)
{
if(l == r)
{
tr[x].x = 1;
return;
}
int mid = l + r >> 1;
build(x << 1, l, mid);
build(x << 1 | 1, mid + 1, r);
upd(x);
}
void pd(int x, int l, int r)
{
int mid = l + r >> 1;
tr[x << 1].tag += tr[x].tag;
tr[x << 1 | 1].tag += tr[x].tag;
tr[x << 1].x += tr[x].tag * (mid - l + 1);
tr[x << 1 | 1].x += tr[x].tag * (r - mid);
tr[x].tag = 0;
}
void modify(int x, int l, int r, int id)
{
if(l == r)
{
tr[x].tag -= tr[x].x; tr[x].x = 0;
return;
}
int mid = l + r >> 1;
pd(x, l, r);
if(id <= mid)modify(x << 1, l, mid, id);
else modify(x << 1 | 1, mid + 1, r, id);
upd(x);
}
ll query(int x, int l, int r, int L, int R)
{
if(L <= l and r <= R)return tr[x].x;
int mid = l + r >> 1; int ret = 0;
pd(x, l, r);
if(L <= mid)ret += query(x << 1, l, mid, L, R);
if(R > mid)ret += query(x << 1 | 1, mid + 1, r, L, R);
return ret;
}
signed main()
{
scanf("%s", s + 1); n = strlen(s + 1);
for(int i = 1; i <= n; i++)d[s[i] - 'A'].push_back(i);
for(int i = 0; i < 26; i++)if(d[i].size() & 1)cnt++;
if(cnt > 1){cout << - 1; return 0;}
build(1, 1, n);
for(int i = 1; i <= n / 2; i++)
{
ll mi = 2147483648; int now = 0;
for(int k = 0; k < 26; k++)
{
if(d[k].size() < 2)continue;
ll l = query(1, 1, n, 1, d[k][0]) - 1ll;
ll r = query(1, 1, n, d[k][d[k].size() - 1], n) - 1ll;
if(l + r < mi)mi = l + r, now = k;
}
ans += mi;
modify(1, 1, n, d[now][0]); modify(1, 1, n, d[now][d[now].size() - 1]);
d[now].pop_front(); d[now].pop_back();
}
cout << ans; return 0;
}
为什么会T?