牛客网948题

牛客网第948题

回那是一串符号,在反转时等于自身。给定一个输入字符串(不一定是回文,则计算将字符串转换为回文所需的交换数)。通过交换,我们的意思是反转两个相邻符号的顺序。例如,字符串"妈妈"可以转换为回文"夫人"与3个交换:
交换"广告",以产生"妈妈"交换"md",
以产生"妈妈"交换"
妈妈",以产生"夫人"
输入描述
第一行输入给出 n,测试用例的数量。对于每个测试用例,接下来是一行输入,其中包含最多 8000 个小写字母的字符串。
输出描述
输出由每个测试用例的一行组成。如果无法将输入转换为回文,则此行将包含交换数或"不可能"。
输入例子
3
mamad
asflkj
aabb
输出例子
3

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define REP(i,x,v) for(int i=x;i<=v;i++)
#define REPD(i,x,v) for(int i=x;i>=v;i–)
#define FOR(i,v) for(int i=0;i<v;i++)
#define CLR(x,y) memset(x,y,sizeof(x))
#define pb push_back
#define sz size()
#define mp make_pair
#define fi first
#define se second
#define LL long long
#define cz(x) scanf("%d",&(x))
#define cz2(x,y) scanf("%d%d", &(x), &(y))
#define cz3(x,y,z) scanf("%d%d%d", &(x), &(y), &(z))
#define MAXN 8000+50
using namespace std;
typedef pair<int, int> pii;
typedef vector vi;

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;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值