// UVa 10716 - Evil Straw Warts Live
// Greedy
#include <iostream>
#include <string>
#include <map>
using namespace std;
bool is_palindromic(string s) {
map<char, int> count;
for (int i = 0; i < s.length(); i++)
count[s[i]]++;
int odds = 0;
for (int i = 0; i < s.length(); i++)
if (count[s[i]] & 1) {
odds++;
count[s[i]] = 0;
}
return odds <= 1;
}
int move(int from, int to, string& s) {
int inc = (from < to ? 1 : -1);
char tmp = s[from];
for (int k = from; k != to; k += inc)
s[k] = s[k + inc];
s[to] = tmp;
return (to - from) * inc;
}
int main() {
int t;
for (cin >> t; t; t--) {
string s;
cin >> s;
if (!is_palindromic(s))
cout << "Impossible" << endl;
else {
int sol = 0;
int a = 0, b = s.length() - 1;
while (a < b) {
if (s[a] != s[b]) {
map<char, int> right_most;
for (int k = b; k >= a; k--) {
if (right_most[s[k]] == 0)
right_most[s[k]] = k;
}
int best = a;
for (int k = a + 1; k <= b; k++) {
if (k - a + b - right_most[s[k]] < best - a + b - right_most[s[best]])
best = k;
}
sol += move(right_most[s[best]], b, s);
sol += move(best, a, s);
}
a++;
b--;
}
cout << sol << endl;
}
}
return 0;
}
Wednesday, May 13, 2015
UVa 10716 - Evil Straw Warts Live
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment