資源限制
時間限制:1.0s 內存限制:512.0MB
問題描述
迴文串,是一種特殊的字符串,它從左往右讀和從右往左讀是同樣的。小龍龍認爲迴文串纔是完美的。如今給你一個串,它不必定是迴文的,請你計算最少的交換次數使得該串變成一個完美的迴文串。
交換的定義是:交換兩個相鄰的字符
例如mamad
第一次交換 ad : mamda
第二次交換 md : madma
第三次交換 ma : madam (迴文!完美!)
輸入格式
第一行是一個整數N,表示接下來的字符串的長度(N <= 8000)
第二行是一個字符串,長度爲N.只包含小寫字母
輸出格式
若是可能,輸出最少的交換次數。
不然輸出Impossible
樣例輸入
5
mamad
樣例輸出
3
給定一個字符串,每一個字符只能交換他左右兩個,問最小步數,策略:css
#include<iostream> using namespace std; char a[8005]; int n; int flag=0; int ans=0; int index=0; int len; int main() { cin>>len; cin>>a+1; n=len; for(int i=1;i<=n;i++) for(int j=n;j>=1;j--) { if(i==j) { flag++; if(len%2==0||flag>1) { puts("Impossible"); return 0; } index=len/2-i+1;//若是沒有找到匹配的把它放到中間。 break; } else if(a[i]==a[j]) { ans+=n-j;//步數加移動的距離 for(int l=j;l<n;l++)//把找到字符的後面的字符都往前移動一位,把字符放到對應的位置 a[l]=a[l+1]; a[n]=a[i]; n--;//找到了字符串最大值減少 break; } } cout<<ans+index<<endl; return 0; }