转自: http://blog.youkuaiyun.com/chenguolinblog/article/details/7908609
贪心法,从两端开始找,如果不相等,试着找最近相等的字符。
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <climits>
using namespace std;
#define MAXN 110
int t , ans;
int num[26];
char ch[MAXN];
bool judge()
{
int i , cnt;
memset(num , 0 , sizeof(num));
for(i = 0 ; i < strlen(ch) ; i++)
num[ch[i]-'a']++;
for(i = 0 , cnt = 0 ; i < 26 ; i++)
{
if(num[i]%2 && num[i]) cnt++;
}
if(cnt > 1) return false;
return true;
}
void solve()
{
if(!judge()){
printf("Impossible\n");
return;
}
int l_pos , r_pos, i, j;
int left = 0, right = strlen(ch)-1;
int res = 0;
while(left < right)
{
if(ch[left] != ch[right])
{
l_pos = r_pos = INT_MAX;
for(i=left+1; i<right; i++)
{
if(ch[i] == ch[right])
{
l_pos = i-left;
break;
}
}
for(j=right-1; j>left; j--)
{
if(ch[j] == ch[left])
{
r_pos = right-j;
break;
}
}
if(l_pos < r_pos)
{
res += l_pos;
for(i = left+l_pos; i>left; i--)
{
swap(ch[i], ch[i-1]);
if(ch[i] == ch[i-1])
res--;
}
}
else
{
res += r_pos;
for(j=right-r_pos; j<right; j++)
{
swap(ch[j], ch[j+1]);
if(ch[j] == ch[j+1])
res--;
}
}
}
if(ch[left] == ch[right])
{
left++;
right--;
}
}
printf("%d\n" , res);
}
int main(){
scanf("%d%*c" , &t);
while(t--){
scanf("%s" , ch);
solve();
}
return 0;
}