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