牛客网第948题
回那是一串符号,在反转时等于自身。给定一个输入字符串(不一定是回文,则计算将字符串转换为回文所需的交换数)。通过交换,我们的意思是反转两个相邻符号的顺序。例如,字符串"妈妈"可以转换为回文"夫人"与3个交换:
交换"广告",以产生"妈妈"交换"md",
以产生"妈妈"交换"
妈妈",以产生"夫人"
输入描述
第一行输入给出 n,测试用例的数量。对于每个测试用例,接下来是一行输入,其中包含最多 8000 个小写字母的字符串。
输出描述
输出由每个测试用例的一行组成。如果无法将输入转换为回文,则此行将包含交换数或"不可能"。
输入例子
3
mamad
asflkj
aabb
输出例子
3
#include
#include
#include
#include
#include
#include
#include
char str[MAXN];
int digit[26], len;
int cnt;
int ans = 0;
int main(){
int num;
cz(num);
while(num–){
cnt = 0;
ans = 0;
CLR(digit, 0);
scanf("%s", str);
int len = strlen(str);
FOR(i, len){
digit[str[i]-‘a’]++;
}
FOR(i, 26){
if(digit[i] & 0x1){
cnt++;
}
}
if(cnt >= 2){
printf(“Impossible\n”);
}
else{
FOR(i, len/2){
char value = str[i];
bool flag = false;
for(int j = len-1-i; j > i; --j){
if(str[i] == str[j]){
flag = true;
for(int k = j; k < len-i-1; ++k){
str[k] = str[k+1];
ans++;
}
str[len-i-1] = value;
break;
}
}
if(!flag){
char tmp;
tmp = str[i];
str[i] = str[i+1];
str[i+1] = tmp;
ans++;
–i;
}
}
printf("%d\n", ans);
}
}
return 0;
}