每日一题之 hiho1775 密码转化

描述
小 Hi 有一个密码锁,密码锁可以看成是一个长度为 n 的01序列,每次小 Hi 可以选择密码锁的连续一段,然后把其中的 0 变成 1,1 变成 0

现在小 T 知道了密码是什么,给定密码锁一开始的序列 S ,问最少用几次操作可以变成序列 P

输入
第一行一个正整数n

第二行一个长度为 n 的 01 序列,表示序列 S

第三行一个长度为 n 的 01 序列,表示序列 P

1 ≤ n ≤ 2×105

输出
输出最少的操作次数

样例解释
先变成110101,然后变成110011

样例输入
6
101010
110011
样例输出
2

思路:

比较 101010 和 110011 发现,只要统计这两个串中的每个位置不相同的段,有多少个就行了。比如 a 串的a[1:2] 和 b[1:2] 正好相反(下标从0开始算)以及 a[5]和b[5]也是正好相反,那么这里刚好可以进行翻转。所以a串一共翻转两次就得到b串了。

#include <cstdio>
#include <iostream>
#include <cstring>

using namespace std;

int main()
{
    int n;
    cin >> n;
    string a,b;
    cin >> a >> b;
    int len = a.length();
    int tmp = 0;
    int res = 0;
    for (int i = 0; i < len; ++i) {
        if (a[i] != b[i]) {
            if (tmp == 0) {
                ++tmp;
                ++res;
            }
        }
        else
            tmp = 0;
    }

    cout << res << endl;

    return 0;
}

猜你喜欢

转载自blog.csdn.net/u014046022/article/details/80889793