Problem:
Score : 1400 points

Problem Statement

You are given strings s and t, both of length N.
s and t consist of 0 and 1. Additionally, in these strings, the same character never occurs three or more times in a row.

You can modify s by repeatedly performing the following operation:

Choose an index i (1 \leq i \leq N) freely and invert the i-th character in s (that is, replace 0 with 1, and 1 with 0), under the condition that the same character would not occur three or more times in a row in s after the operation.

Your objective is to make s equal to t.
Find the minimum number of operations required.

Constraints

1 \leq N \leq 5000

The lengths of s and t are both N.

s and t consists of 0 and 1.

In s and t, the same character never occurs three or more times in a row.

Input

Input is given from Standard Input in the following format:

N
s
t

Output

Find the minimum number of operations required to make s equal to t. It can be proved that the objective is always achievable in a finite number of operations.

Sample Input 1

4
0011
0101

Sample Output 1

4

One possible solution is 0011 → 1011 → 1001 → 1101 → 0101.

Sample Input 2

1
0
0

Sample Output 2

0

Sample Input 3

8
00110011
10101010

Sample Output 3

10

Solution in C++ (GCC 9.2.1) (judge verdict: Wrong Answer)

#include <cstdio>
#include <iostream>
#define debug(...) fprintf(stderr,__VA_ARGS__)
using namespace std;
template<class T> void rd(T &x) {
	x=0; int f=1,ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=x*10-'0'+ch;ch=getchar();}
	x*=f;
}
const int maxn=5000+5;
int n,s[maxn],t[maxn]; char S[maxn],T[maxn];
int an;
void trans(char *S,int *s) {
	for(int i=1;i<=n;++i) s[i]=S[i]-'0';
	s[0]=s[n+1]=s[n+2]=-1;
}
void dfs(int u) {
	if(s[u-1]==(s[u]^1)&&s[u+1]==(s[u]^1)) {
		dfs(u+1);
		s[u]^=1,++an;
		return;
	}
	if(s[u+1]==(s[u]^1)&&s[u+2]==(s[u]^1)) {
		dfs(u+2);
		s[u]^=1,++an;
		return;
	}
	s[u]^=1,++an;
}
int main() {
	rd(n);
	scanf("%s",S+1); trans(S,s);
	scanf("%s",T+1); trans(T,t);
	for(int i=1;i<=n;++i) if(s[i]!=t[i]) {
		dfs(i);
	}
	printf("%d\n",an);
	return 0;
}