题 意:给你两个长度为n的字符串,通过三种交换操作 1.(Ai,Bi),2.(Ai,An-i+1),3.(Bi,Bn-i+1) 和 set操作,即set ai = 任意字符c 。
限制条件。set 操作只能对a进行操作,在交换操作之后不能再执行set操作。
输入限制:
1<=n<=1e5
样例输入:
7
abacaba
bacabaa
样例输出
4
思路:仔细思考发现这题的关键在于分类,什么情况下需要不需要set ,什么情况下需要set一个,什么情况下需要set两个。最多set两个可以使Ai和An-i-1和对应的B相等。 一定要注意怎么去分情况,要不很费时间,还写不出。
1. 当对应相等的时候,等左右交换一次对应相等的时候,等上下左右交换一次对应相等的时候。不需要set
2. 再不满足不需要set的条件下,只有一个对应相等,左右交换后只有一个对应相等,最容易漏的一个就是 当Bi = Bn-i-1的时候 也只需要一次
3. 剩下的都是需要两次的了
收获:这题收获就是以前经常碰到这种很耗时间的题,没有注意这种题的解题关键点再哪,分好情况,不漏情况。
#include<bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f3f;
const int maxn = 1e5+5;
typedef long long ll;
int n;
char s1[maxn],s2[maxn];
int main(){
scanf("%d",&n);
scanf("%s",s1);
scanf("%s",s2);
int sum = 0;
for(int i=0;i<n/2;i++){
//分情况的题找到分类依据很重要
int j = n-i-1;
if((s1[i] == s2[i]&&s1[j] == s2[j]) || (s1[j] == s2[i] && s1[i] == s2[j]) || (s1[i] == s1[j] && s2[i] == s2[j])) continue;
else if(s2[i] == s2[j] || s1[i] == s2[i] || s1[j]==s2[j] || s1[j] == s2[i] || s1[i] == s2[j] ) sum++;
else sum+=2;
}
if(n%2 == 1){
if(s1[(n-1)/2]!=s2[(n-1)/2]) sum++;
}
printf("%d\n",sum);
return 0;
}