#include <iostream> #include <queue> struct tab { std::priority_queue<int> Q[2]; void init(const std::string& str) { for (int i = 0; i < (int)str.size(); i++) { Q[str[i]-'a'].push(i); } } int operator[](const char& c) { return Q[c-'a'].top(); } void pop(const char& c) { Q[(c-'a')^1].pop(); Q[(c-'a')^1].push(Q[c-'a'].top()); Q[c-'a'].pop(); } void remove(const char& c) { Q[c-'a'].pop(); } }; std::string str; tab last; int n; bool valid() { int a = 0, b = 0; for (int i = 0; i < n; i++) { if (str[i] == 'a') a++; else b++; } return !(a & b & 1); } long find() { long result = 0; int l = 0, r = n-1, mid = n/2; last.init(str); while (l < r) { if (str[l] != str[r]) { if (last[str[l]] == l) { result += mid - last[str[l]]; std::swap(str[last[str[l]]], str[mid]); last.pop(str[l]); } else { result += r - last[str[l]]; std::swap(str[last[str[l]]], str[r]); last.pop(str[l]); } } else { last.remove(str[r]); } l++, r--; } return result; } int main() { std::ios_base::sync_with_stdio(0); std::cin.tie(0); std::cin >> str; n = str.size(); std::cout << (valid() ? find() : -1) << '\n'; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | #include <iostream> #include <queue> struct tab { std::priority_queue<int> Q[2]; void init(const std::string& str) { for (int i = 0; i < (int)str.size(); i++) { Q[str[i]-'a'].push(i); } } int operator[](const char& c) { return Q[c-'a'].top(); } void pop(const char& c) { Q[(c-'a')^1].pop(); Q[(c-'a')^1].push(Q[c-'a'].top()); Q[c-'a'].pop(); } void remove(const char& c) { Q[c-'a'].pop(); } }; std::string str; tab last; int n; bool valid() { int a = 0, b = 0; for (int i = 0; i < n; i++) { if (str[i] == 'a') a++; else b++; } return !(a & b & 1); } long find() { long result = 0; int l = 0, r = n-1, mid = n/2; last.init(str); while (l < r) { if (str[l] != str[r]) { if (last[str[l]] == l) { result += mid - last[str[l]]; std::swap(str[last[str[l]]], str[mid]); last.pop(str[l]); } else { result += r - last[str[l]]; std::swap(str[last[str[l]]], str[r]); last.pop(str[l]); } } else { last.remove(str[r]); } l++, r--; } return result; } int main() { std::ios_base::sync_with_stdio(0); std::cin.tie(0); std::cin >> str; n = str.size(); std::cout << (valid() ? find() : -1) << '\n'; } |