完美的代价

完美的代价
 

Description

 

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

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

例如mamad

第一次交换 ad : mamda

第二次交换 md : madma

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

 

Input

 

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

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

 

Output

 

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

否则输出Impossible

 

#include<iostream>
#include<cstdio>


using namespace std;

int main(){
    int N;
    string s;
    cin>>N;
    cin>>s;
    int cnt=0;
    
    int j=N-1;
    int flag=0;
    for(int i=0;i<j;i++){
        for(int k=j;k>=i;k--){
            if(k==i){
                if(N%2==0||flag==1){
                    cout<<"Impossible";
                    return 0;
                }
                flag=1;
                cnt+=N/2-i;
            }
            else if(s[k]==s[i]){
                for(int l=k;l<j;l++){
                    swap(s[l],s[l+1]);
                    cnt++;
                }
                j--;
                break;
            }
        }
    }
    cout<<cnt;
    return 0;
}

 

posted on 2020-10-07 20:15  Taurus20000519  阅读(76)  评论(0)    收藏  举报