```go
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
scanner := bufio.NewScanner(os.Stdin)
scanner.Scan()
var n int
fmt.Sscan(scanner.Text(), &n)
scanner.Scan()
upper := scanner.Text()
scanner.Scan()
lower := scanner.Text()
const INF = -1
dp := make([][][]int, n+2)
for i := range dp {
dp[i] = make([][]int, 2)
for j := range dp[i] {
dp[i][j] = make([]int, 3)
for k := range dp[i][j] {
dp[i][j][k] = INF
}
}
}
dp[1][0][0] = 0
for j := 1; j <= n; j++ {
for r := 0; r < 2; r++ {
for ff := 0; ff < 3; ff++ {
val := dp[j][r][ff]
if val == INF {
continue
}
can := [2]bool{upper[j-1] == '1', lower[j-1] == '1'}
forbid := ff - 1
if forbid != -1 {
can[forbid] = false
}
same := r
oth := 1 - r
// none
{
add := 0
new_r := r
new_forbid := -1
new_ff := new_forbid + 1
dp[j+1][new_r][new_ff] = max(dp[j+1][new_r][new_ff], val+add)
}
// only same
if can[same] {
add := 1
new_r := same
new_forbid := -1
new_ff := new_forbid + 1
dp[j+1][new_r][new_ff] = max(dp[j+1][new_r][new_ff], val+add)
}
// only other
if can[oth] {
add := 1
new_r := oth
new_forbid := r
new_ff := new_forbid + 1
dp[j+1][new_r][new_ff] = max(dp[j+1][new_r][new_ff], val+add)
}
// both
if can[same] && can[oth] {
add := 2
new_r := oth
new_forbid := r
new_ff := new_forbid + 1
dp[j+1][new_r][new_ff] = max(dp[j+1][new_r][new_ff], val+add)
}
}
}
}
ans := 0
for r := 0; r < 2; r++ {
for ff := 0; ff < 3; ff++ {
if dp[n+1][r][ff] > ans {
ans = dp[n+1][r][ff]
}
}
}
fmt.Println(ans)
}
func max(a, b int) int {
if a > b {
return a
}
return b
}
```