完璧な基本価格の練習
時間制限を:1.0秒メモリ制限:512.0メガバイトの
問題の記述
回文文字列を、それが左右の読書に左から右に読んで、文字列の特殊な種類の同じです。少し曇っては完璧回文文字列であると考えています。あなたは、文字列を与えられて、それは必ずしも回文ではありません、あなたは取引所の最小数を計算するように完璧な回文文字列に文字列。
交換の定義は、2つの隣接する文字の交換
例えばmamad
mamda:最初の交換広告
第二の交差MD:madma
第交換MA:マダム(!!完全パリンドローム)
入力フォーマット
最初の行の整数でありますN、文字列(N <= 8000)の次長さは
第二行は小文字のみN.用の文字列である
出力形式
可能であれば、交換の最小数の出力。
それ以外の場合は、出力インポッシブル
サンプル入力
5
mamadの
サンプル出力
3
アイデア:貪欲、コードを見て具体的には、知らない(ので右である理由として
#include<iostream>
using namespace std;
int main()
{
int n;
cin>>n;
string s;
cin>>s;
int ans=0;
bool flag=false;//前面存不存在一个单身汉
for(int i=0,j=n-1;i<j;++i){//枚举每一个没有找到配偶的字符
for(int k=j;k>=i;k--){//为它找配偶
if(i==k){//找到自己了,说明是单身汉,在一个字符串里,若是偶数个则不能有单身汉,若是奇数个只能有一个单身汉
if(n%2==0||flag){
cout<<"Impossible"<<endl;
return 0;
}
flag=true;
ans+=n/2-i;//这里先把单身汉放在这里,若是把它先移到中间,其他人找配偶时,就可能会经过他,这是会有多余操作(把他从中间让道,再把他放中间)
}
else if(s[i]==s[k]){//找到之后放到相应的位置
for(int l=k;l<j;++l){
swap(s[l],s[l+1]);
ans++;
}
j--;//匹配下一个
break;//找到之后就跳出循环,不用找第三者了
}
}
}
cout<<ans<<endl;
return 0;
}