没有看明白这标题配图和题目有什么关系,好像这是一张专辑的名字。先要考虑有多少个字母总数是奇数,超过1个就直接输出impossible。每一次考虑两端点情况,如果字母不同,再进行搜索,换那个字母交换次数比较少,然后进行交换那一边的字母,直到变成回文串。
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<iostream>
using namespace std;int main()
{int cas,i,j,a[27],f,cnt,len,t1,t2,k;char str[1024],c;scanf("%d",&cas);getchar();while(cas--){cnt=0;memset(a,0,sizeof(a));scanf("%s",str);for(i=0;str[i]!=0;i++)a[str[i]-'a']++;f=0;for(i=0;i<26;i++){if(a[i]%2) f++;if(f>=2) break;}if(f>=2) printf("Impossible\n");else{len=strlen(str);for(i=0;i<len/2;i++){j=len-1-i;if(str[i]!=str[j]){for(t1=i;str[t1]!=str[j];t1++);for(t2=j;str[t2]!=str[i];t2--);if(t1-i>j-t2){cnt+=j-t2;for(k=t2;k<j;k++)str[k]=str[k+1];}else{cnt+=t1-i;for(k=t1;k>i;k--)str[k]=str[k-1];}}}printf("%d\n",cnt);}getchar();}return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。http://xiang578.top/