Codeforce C. Game with Reversing

题目大意:

想要把S串转化为T串,需要循环一下两种操作。

1把一个字符变成另一个字符

2将整个字符串倒置

我的思路如下:

只有两种情况。

(1)最终将S变为T。

(2)最终将S变为R的。设R为reverse(T);

(1)将S变为T。如果ST之间有x个字符不一样,那么对应y个操作。

x=1        y=1 

x=2       y=4                先转换一个不一样的字符,再倒置S,再转换一个不一样的字符,再倒置

x=3        y=5               在x=2的基础上,再转化一个不一样的字符。

由此我们得到一个公式: y=x/2*4+x%2.

(2)将S转换为R。不妨先用操作把R倒置为T,然后走(1)的判断路线就行了。但是倒置之前是要把选一个字符转换的,我当然可以将这个字符转换为原字符,但是也是一个操作,就不是最小的了,那我们就分类操作。假如R S之间没有不一样的,假如R S之间只有一个不一样的,假如R S之间有两个或者多个不一样的。

        由此我们得到AC代码:
 

//
//  main.cpp
//  C
//
//  Created by 汪汪队 on 2023/7/17.
//

#include <iostream>
using namespace std;

int get_cnt(int cnt){
    if(cnt&1) return (cnt+1)*2;
    return 2*cnt;
}

int test(){
    int n;
    cin>>n;
    string s,t;
    cin>>s>>t;
    string r=t;
    reverse(r.begin(),r.end());
    if(s==t) return 0;
    if(s==r) return 2;
    int ti=0;
    for (int i=0; i<s.length(); i++) {
        if(s[i]!=t[i]) ti++;
    }
    if(ti==1) return 1;
    int ri=0;
    for (int i=0; i<s.length(); i++) {
        if(s[i]!=r[i]) ri++;
    }
    if(ri==1) return 2;
    return min((ri-1)/2*4+(ri-1)%2+2,ti/2*4+ti%2);
}

int main() {
    int tests;
    cin>>tests;
    while (tests--) {
        cout<<test()<<endl;
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值