问题描述

  回文串,是一种特殊的字符串,它从左往右读和从右往左读是一样的。小龙龙认为回文串才是完美的。现在给你一个串,它不一定是回文的,请你计算最少的交换次数使得该串变成一个完美的回文串。

  交换的定义是:交换两个相邻的字符

  例如mamad

  第一次交换 ad: mamda

  第二次交换 md: madma

  第三次交换 ma: madam (回文!完美!)

输入格式

  第一行是一个整数N,表示接下来的字符串的长度(N <= 8000)

  第二行是一个字符串,长度为N.只包含小写字母

输出格式

  如果可能,输出最少的交换次数。

  否则输出Impossible

样例输入

5

mamad

样例输出

3


public static void main(String args[]){
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
String s=sc.next();
char a[]=s.toCharArray();
int b[]=new int[26];
int j;
int k=0;
char x='0';
for(int i=0;i<n;i++){
j=a[i]-'a';
b[j]++;
}
for(int i=0;i<26;i++){
if(b[i]%2!=0){
k++;
x=(char)(i+'a');
}
}

if(k>=2){
System.out.println("Impossible");
}
else {
System.out.println(changes(a,x,n));
}
}
public static long changes(char s[],char x,int n){
int i,j,k, change=0;
for(i=0;i<n/2;i++){
if(s[i]==x){
for(j=i;j<n-i-1;j++)
if(s[n-i-1]==s[j]){
break;
}
change=change+j-i;
for(k=j;k>i;k--)
s[k]=s[k-1];
s[i]=s[n-i-1];
}
else{
for(j=n-i-1;j>=i;j--)
if(s[i]==s[j]) break;
change=change+n-i-1-j;
for(k=j;k<n-i-1;k++)
s[k]=s[k+1];
s[n-i-1]=s[i];
}
}
return change;
}