记录编号 577636 评测结果 AAAAAAAAAA
题目名称 回文串回文 最终得分 100
用户昵称 Gravataryrtiop 是否通过 通过
代码语言 C++ 运行时间 0.425 s
提交时间 2022-11-16 20:39:14 内存使用 5.46 MiB
显示代码纯文本
// Problem: E - Papple Sort
// Contest: AtCoder - AtCoder Regular Contest 088
// URL: https://atcoder.jp/contests/arc088/tasks/arc088_c
// Memory Limit: 256 MB
// Time Limit: 2000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

#include <bits/stdc++.h>
using i64 = long long;

const int maxn = 1e6 + 5;
char s[maxn];
int n,c[maxn],a[maxn];
std::list<int> G[50];
i64 ans;

int lowbit(int x) {
	return x & -x;
}

void add(int x,int y) {
	for(;x <= n;x += lowbit(x))c[x] += y;
	return ;
}

int query(int x) {
	int ans = 0;
	for(;x;x -= lowbit(x))ans += c[x];
	return ans;
}

int main() {
	freopen("strts.in","r",stdin);
	freopen("strts.out","w",stdout);
	scanf("%s",s + 1);
	n = strlen(s + 1);
	
	for(int i = 1;i <= n;++ i) {
		s[i] -= 'a';
		G[s[i]].emplace_back(i);
	}
	
	int cnt = 0;
	for(int i = 0;i < 26;++ i)
		cnt += G[i].size() & 1;
	if(cnt > 1) {
		puts("-1");
		return 0;
	}
	
	cnt = 0;
	for(int i = 1;i <= n;++ i) {
		if(a[i])continue ;
		if(G[s[i]].size() == 1)continue ;
		if((n & 1)&&cnt + 1 == (n + 1) / 2)++ cnt;
		a[i] = ++ cnt;
		G[s[i]].pop_front();
		a[G[s[i]].back()] = n - cnt + 1;
		G[s[i]].pop_back();
	}
	if(n & 1)
		for(int i = 1;i <= n;++ i)
			if(!a[i])
				a[i] = (n + 1) >> 1;
	
	for(int i = 1;i <= n;++ i) {
		ans += i - 1 - query(a[i]);
		add(a[i] , 1);
	}
	
	printf("%lld\n",ans);
	return 0;
}