题目链接:
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;
}