/*完美的代價
問題描述 回文串,是一種特殊的字符串,它從左往右讀和從右往左讀是一樣的。小龍龍認為回文串才是完美的。現在給你一個串,它不一定是回文的,請你計算最少的交換次數使得該串變成一個完美的回文串。
交換的定義是:交換兩個相鄰的字符
例如mamad
第一次交換 ad : mamda
第二次交換 md : madma
第三次交換 ma : madam (回文!完美!)
輸入格式 第一行是一個整數N,表示接下來的字符串的長度(N <= 8000) 第二行是一個字符串,長度為N.只包含小寫字母
輸出格式 如果可能,輸出最少的交換次數。 否則輸出Impossible
樣例輸入
5
mamad
樣例輸出3*/
#include <stdio.h>?
#include <string.h>? ?
#define N 8000? ?
int main(void){? ? ?
int n;? ?
scanf("%d",&n);? ? ? ? ? ?
char a[N];? ? ?
scanf("%s",a);? ? ? ? ? ? ? ?
int i,j,t,l,p;? ? ?
j=n-1;? ? ?
int flag=0;? ? ?
int step=0;? ? ?
for(i=0;i<j;i++){? ? ? ? ?
t=j;? ? ? ? ? //查找匹配的字符? ? ? ? ?
while(a[i]!=a[t]){? ? ? ? ? ? ?
t--;? ? ? ? ? }? ? ? ? ?
char temp;? ? ? ? ?
if(i==t){? //如果為單個字符? ? ? ? ? ? ?
flag++;? ? ? ? ? ?
? if(n%2==0||flag>1){? ? ? ? ? ? ? ? ?
printf("Impossible");? ? ? ? ? ? ? ? ?
return 0;? ? ? ? ? ? ? }? ? ? ? ? ?
step+=n/2-i;? ? ? ? ? ? ? ? ? ? ? ? ? ?
continue;? //如果不加該語句,則單個字符也會執行下面的if語句a[i]==a[t] && t==i? ? ? ? ?
}? ? ? ? ? //如果找到相匹配的兩個數? ? ? ? ?
if(a[i]=a[t]){? ? ? ? ? ? ? ? ? ? ? ?
step+=j-t;? ? ? ? ? ? ?
temp=a[t];? ? ? ? ? ? ?
for(l=t;l<j;l++)
{? ? ? ? ? ? ? ? ? a[l]=a[l+1];? ? ? ? ? ? ? }? ? ? ? ? ? ?
a[l]=temp;? ? ? ? ? ? ?
j--;? ? ? ? ?
}? ?
}? ? ? ? ? ? ?
printf("%d",step);? ? ? ?
return 0;? ?
}?