codeforce-1006D

codeforce-1006D

题 意:给你两个长度为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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值