package main
import (
"bufio"
"fmt"
"os"
)
func main() {
in := bufio.NewReader(os.Stdin)
out := bufio.NewWriter(os.Stdout)
defer out.Flush()
var n int
var l, r string
if _, err := fmt.Fscan(in, &n); err != nil {
return
}
fmt.Fscan(in, &l)
fmt.Fscan(in, &r)
lpos := make([][]int, 27)
rpos := make([][]int, 27)
for i := 0; i < n; i++ {
c := l[i]
if c == '?' {
lpos[26] = append(lpos[26], i+1)
} else {
lpos[int(c-'a')] = append(lpos[int(c-'a')], i+1)
}
}
for i := 0; i < n; i++ {
c := r[i]
if c == '?' {
rpos[26] = append(rpos[26], i+1)
} else {
rpos[int(c-'a')] = append(rpos[int(c-'a')], i+1)
}
}
type pair struct{ a, b int }
pairs := make([]pair, 0)
// Match same letters
for c := 0; c < 26; c++ {
for len(lpos[c]) > 0 && len(rpos[c]) > 0 {
li := lpos[c][len(lpos[c])-1]
ri := rpos[c][len(rpos[c])-1]
lpos[c] = lpos[c][:len(lpos[c])-1]
rpos[c] = rpos[c][:len(rpos[c])-1]
pairs = append(pairs, pair{li, ri})
}
}
// Match left '?' with right letters
for c := 0; c < 26; c++ {
for len(lpos[26]) > 0 && len(rpos[c]) > 0 {
li := lpos[26][len(lpos[26])-1]
ri := rpos[c][len(rpos[c])-1]
lpos[26] = lpos[26][:len(lpos[26])-1]
rpos[c] = rpos[c][:len(rpos[c])-1]
pairs = append(pairs, pair{li, ri})
}
}
// Match right '?' with left letters
for c := 0; c < 26; c++ {
for len(rpos[26]) > 0 && len(lpos[c]) > 0 {
li := lpos[c][len(lpos[c])-1]
ri := rpos[26][len(rpos[26])-1]
lpos[c] = lpos[c][:len(lpos[c])-1]
rpos[26] = rpos[26][:len(rpos[26])-1]
pairs = append(pairs, pair{li, ri})
}
}
// Match '?' with '?'
for len(lpos[26]) > 0 && len(rpos[26]) > 0 {
li := lpos[26][len(lpos[26])-1]
ri := rpos[26][len(rpos[26])-1]
lpos[26] = lpos[26][:len(lpos[26])-1]
rpos[26] = rpos[26][:len(rpos[26])-1]
pairs = append(pairs, pair{li, ri})
}
fmt.Fprintln(out, len(pairs))
for _, p := range pairs {
fmt.Fprintln(out, p.a, p.b)
}
}