← Home
```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
}
```