题目大意:
想要把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;
}