问题描述
回文串,是一种特殊的字符串,它从左往右读和从右往左读是一样的。小龙龙认为回文串才是完美的。现在给你一个串,它不一定是回文的,请你计算最少的交换次数使得该串变成一个完美的回文串。
交换的定义是:交换两个相邻的字符
例如mamad
第一次交换 ad : mamda
第二次交换 md : madma
第三次交换 ma :madam (回文!完美!)
输入格式
第一行是一个整数N,表示接下来的字符串的长度(N <= 8000)
第二行是一个字符串,长度为N.只包含小写字母
输出格式
如果可能,输出最少的交换次数。
否则输出Impossible
样例输入
5
mamad
样例输出
3
代码(原文)
#include<stdio.h>
int change(char str[],char x,int len){
int i,j,k,count = 0;
for(int i = 0;i < len / 2;i++){
if(str[i] == x){
for(j = i;j < len - i - 1;j++){
if(str[j] == str[len - i - 1]) break;
}
count += j - i;
for(k = j;k > i;k--) str[k] = str[k-1];
str[i] = str[len - 1 - i];
}
else{
for(j = len - i - 1;j >= i;j--){
if(str[i] == str[j]) break;
}
count += len - 1 - i - j;//i,j对称,则i+j=len-1;
for(k = j;k < len - 1 - i;k++) str[k] = str[k+1];
str[len - i - 1] = str[i];
}
}
return count;
}
int main(){
char str[8000] = {0},x;
int len,b[26] = {0},i,j,k = 0;
scanf("%d",&len);
getchar();
for(i = 0;i < len;i++){
scanf("%c",&str[i]);
}
for(i = 0;i < len;i++){
j = str[i] - 'a';
b[j]++;
}
for(j = 0;j < 26;j++){
if(b[j] % 2 != 0){
k++;
x = j + 'a';
}
}
if(k >= 2){
printf("Impossible\n");
}
else printf("%d\n",change(str,x,len));
return 0;
}