poj 1854
求一个字符串相邻字母经过多少次交换后可以让这个字符串变成回文串。
解法:对首尾字母分治
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cstdlib>
using namespace std;
string a;
int num[30],res;
int check(){
int cc = 0;
memset(num,0,sizeof(num));
for(int i = 0;i<a.size();++i)
++num[a[i] - 'a'];
for(int i = 0;i<26;++i)
if(num[i] % 2 != 0)
++cc;
return cc;
}
void solve(int l,int r){
if(l >= r) return;
if(a[l] != a[r]){
int lp = l,rp = r,llen = r-l,rlen = r-l;
for(int i = r;i>l;--i){
if(a[i] == a[l]){
rlen = r-i;
rp = i;
break;
}
}
for(int i = l;i<r;++i){
if(a[i] == a[r]){
llen = i-l;
lp = i;
break;
}
}
if(llen < rlen){
res += llen;
for(int i = lp;i>l;--i){
swap(a[i],a[i-1]);
}
}
else{
res += rlen;
for(int i = rp;i<r;++i){
swap(a[i],a[i+1]);
}
}
}
solve(l+1,r-1);
}
int main(){
int t;
cin>>t;
while(t--){
cin>>a;
if(check() > 1){
cout<<"Impossible\n";
continue;
}
res = 0;
solve(0,a.size()-1);
cout<<res<<endl;
}
return 0;
}