藍杯十七

/*完美的代價

問題描述  回文串,是一種特殊的字符串,它從左往右讀和從右往左讀是一樣的。小龍龍認為回文串才是完美的。現在給你一個串,它不一定是回文的,請你計算最少的交換次數使得該串變成一個完美的回文串。  

交換的定義是:交換兩個相鄰的字符  

例如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;? ?

}?

圖片發自簡書App

圖片發自簡書App

圖片發自簡書App
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容