C. Equalize
time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output
You are given two binary strings a
and b of the same length. You can perform the following two operations on the string a
:
- Swap any two bits at indices i
and j respectively (1≤i,j≤n), the cost of this operation is |i−j|, that is, the absolute difference between i and j
- .
- Select any arbitrary index i
- (1≤i≤n) and flip (change 0 to 1 or 1 to 0) the bit at this index. The cost of this operation is 1
Find the minimum cost to make the string a
equal to b. It is not allowed to modify string b.
Input
The first line contains a single integer n
(1≤n≤106) — the length of the strings a and b.
The second and third lines contain strings a
and brespectively.
Both strings a
and b have length nand contain only '0' and '1'.
Output
Output the minimum cost to make the string a
equal to b.
Examples
InputCopy
3 100 001
OutputCopy
2
InputCopy
4 0101 0011
OutputCopy
1
Note
In the first example, one of the optimal solutions is to flip index 1
and index 3, the string a changes in the following way: "100" → "000" → "001". The cost is 1+1=2.
The other optimal solution is to swap bits and indices 1
and 3, the string a changes then "100" → "001", the cost is also |1−3|=2.
In the second example, the optimal solution is to swap bits at indices 2
and 3, the string a changes as "0101" → "0011". The cost is |2−3|=1.
给你2串01字符串.,有2种操作,将i和j对调代价为abs(i-j)or将i位置的数0变1,1变0代价为1,让你计算出a串变b串的最小代价。
题意:
思路:
观察:串只有01,且只有2串,长度为1e6,所以只有O(n)的方法
假设:据观察可得,若对调位置不是相邻,代价必定比反转2个位置高,即遍历字符串a并判相邻字符串能否对调即可
验证:代码
得出结论:假设正确
code:
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<vector>
#include<queue>
#include<string>
#include<stack>
#include<string.h>
# include <cstdio>
# include <iostream>
#include <algorithm>
#include <iostream>
#include <iterator>
#include <ostream>
#include <string>
#include <utility>
#include <vector>
using namespace std;
const int Max=1e6+5;
char s1[Max],s2[Max];
int book[Max];
int main()
{
int n,ans;
cin>>n;
scanf("%s",s1);
scanf("%s",s2);
for(int i=0;i<n-1;i++)
{
if(book[i]||s1[i]==s2[i])
continue;
else
{
if(s1[i+1]!=s2[i+1]&&s1[i+1]!=s1[i])
{
book[i+1]=1;
}
ans++;
}
}
if(s1[n-1]!=s2[n-1]&&!book[n-1])
ans++;
cout<<ans<<endl;
return 0;
}