6.28题解

题目链接:
    https://codeforces.com/contest/1834/problem/C

题目名称:

    Game with Reversing

题目概述:
    有两个字符串S,T。
    有两个操作方法:
        1、选其中一个字符串中的一个字符进行改变。
        2、选其中一个字符串进行反转。
    为了使字符串S和字符串T完全相等,每次操作从操作1开始,操作1是步数尽可能最少,操作2是使步数尽可能多。
    求输出最少的步数。

做题思路:
    可以发现操作2对操作1影响不大,只要最终使字符串变成S或者T或者反T或者反S,步数就是最少的情况。
    故只需要求出操作1的具体步数,再对其乘二,最后根据为了实现字符串相等的情况时是否需要再进行一次反转操作,进行减1还是不变。
    求操作1的步数,是根据S与T的具体数据是否相同。所以要求出S与T,与RT有多少的不同。每有一个不同最终步数肯定是双倍关系的。

输入分析:
    T次询问。
    每次有字符串长度和两个字符串。

输出分析:
    输出最小操作步数。

解题代码:
   

#include <iostream>
#include <cstring>
using namespace std;
string s, t;
int main()
{
	int n;
	cin >> n;
	while(n--){
		int l;
		cin >> l >> s >> t;
		int cnt1 = 0;
		int cnt2 = 0;
		//不同的数目
		for(int i = 0; i < l; i++){
			if(s[i] != t[i])cnt1++;
			//基于反转的前提下,与cnt1讨论不一样
			if(s[i] != t[l-i-1])cnt2++;
		}
		//cout << cnt1 << " " << cnt2 << endl;
		//由于在进行两次反转后作用互相抵消,每有一个不同就需要进行一次反转。
		int ans1 = 2 * cnt1 - (cnt1 % 2 == 1);//根据最终结果判断实际最终是否进行了反转,以及是否需要进行反转
		int ans2 = 2 * cnt2 - (cnt2 % 2 == 0);
		ans2 = max(2, ans2);//由于从操作1开始,在反转的前提下至少都是两次
		cout << max(0, min(ans1, ans2)) << endl;
	}
	return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值