描述
小 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;
}