问题描述
回文串,是一种特殊的字符串,它从左往右读和从右往左读是一样的。小龙龙认为回文串才是完美的。现在给你一个串,它不一定是回文的,请你计算最少的交换次数使得该串变成一个完美的回文串。
交换的定义是:交换两个相邻的字符
例如mamad
第一次交换 ad : mamda
第二次交换 md : madma
第三次交换 ma : madam (回文!完美!)
交换的定义是:交换两个相邻的字符
例如mamad
第一次交换 ad : mamda
第二次交换 md : madma
第三次交换 ma : madam (回文!完美!)
输入格式
第一行是一个整数N,表示接下来的字符串的长度(N <= 8000)
第二行是一个字符串,长度为N.只包含小写字母
第二行是一个字符串,长度为N.只包含小写字母
输出格式
如果可能,输出最少的交换次数。
否则输出Impossible
否则输出Impossible
样例输入
5
mamad
mamad
样例输出
3
#include "stdio.h"
#include "string.h"
int count=0 ;
int zhao(char string[],char c,int start,int end)
{
int i ;
for(i=end-1;i>start;i--)
{
if(string[i]==c)
{
return i ;
}
}
return-1 ;
}
void huan(char string[],int start,int end)
{
char temp ;
int i ;
for(i=start;i<end;i++)
{
count++;
temp=string[i];
string[i]=string[i+1];
string[i+1]=temp ;
}
}
int main()
{
int n,len,i,t,k=0,l ;
char string[8010];
int aaa,bbb ;
scanf("%d",&n);
getchar();
gets(string);
len=strlen(string);
aaa=len/2 ;
for(i=0,l=len-1;i<=aaa;i++,l--)
{
if(string[l]!=string[i])
{
t=zhao(string,string[i],i,l);
//找到相同字母的下标
if(t==-1)
{
if(len%2==0)
{
printf("Impossible\n");
return 0 ;
}
bbb=i ;
k++;
aaa++;
l++;
}
if(t!=-1)
{
huan(string,t,l);
//换字母,统计次数
}
}
}
if(k>1)
{
printf("Impossible\n");
}
else
{
if(len%2!=0&&k==1)
{
huan(string,bbb,len/2);
printf("%d\n",count);
}
else
{
printf("%d\n",count);
}
}
return 0 ;
}