您的位置:首页 > 其它

A1043. 完美的代价

2018-02-13 22:10 183 查看
A1043. 完美的代价时间限制:1.0s   内存限制:512.0MB  问题描述  回文串,是一种特殊的字符串,它从左往右读和从右往左读是一样的。小龙龙认为回文串才是完美的。现在给你一个串,它不一定是回文的,请你计算最少的交换次数使得该串变成一个完美的回文串。
  交换的定义是:交换两个相邻的字符
  例如mamad
  第一次交换 ad : mamda
  第二次交换 md : madma
  第三次交换 ma : madam (回文!完美!)输入格式  第一行是一个整数N,表示接下来的字符串的长度(N <= 8000)
  第二行是一个字符串,长度为N.只包含小写字母输出格式  如果可能,输出最少的交换次数。
  否则输出Impossible样例输入5
mamad样例输出3

#include <stdio.h>
#include <stdlib.h>

int main(){
    int n;
    while((scanf("%d",&n))!=EOF){
        int count_a[26]={0},count_odd=0;
        int ans=0;
        char x[8000],tmp;
        getchar();
        for(int i=0;i<n;i++){
            scanf("%c",&x[i]);
            count_a[x[i]-'a']++;
        }
        for(int i=0;i<26;i++){          
            if(count_a[i]%2!=0){
                count_odd++;
                tmp=i+'a';
            }
        }
        if(count_odd>=2)
            printf("Impossible\n");
        else{
            int i,j,k;
            for(i=0;i<n/2;i++){
                if(x[i]==tmp){
                    for(j=i;j<n-i-1;j++)
                        if(x[n-i-1]==x[j])
                            break;
                    ans+=j-i;
                    for(k=j;k>i;k--)
                        x[k]=x[k-1];
                    x[i]=x[n-i-1];
                }
                else{
                    for(j=n-i-1;j>=i;j--)
                        if(x[i]==x[j])
                            break;
                    ans+=n-i-j-1;
                    for(k=j;k<n-i-1;k++)
                        x[k]=x[k+1];
                    x[n-i-1]=x[i];
                }
            }
            printf("%d\n",ans);
        }
    }

    system("pause");
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: