← Home
package main

import (
	"bufio"
	"fmt"
	"io"
	"os"
)

type FastScanner struct {
	data []byte
	idx  int
	n    int
}

func NewFastScanner() *FastScanner {
	data, _ := io.ReadAll(os.Stdin)
	return &FastScanner{data: data, n: len(data)}
}

func (fs *FastScanner) skip() {
	for fs.idx < fs.n && fs.data[fs.idx] <= ' ' {
		fs.idx++
	}
}

func (fs *FastScanner) Int() int {
	fs.skip()
	v := 0
	for fs.idx < fs.n {
		c := fs.data[fs.idx]
		if c < '0' || c > '9' {
			break
		}
		v = v*10 + int(c-'0')
		fs.idx++
	}
	return v
}

func (fs *FastScanner) String() string {
	fs.skip()
	start := fs.idx
	for fs.idx < fs.n && fs.data[fs.idx] > ' ' {
		fs.idx++
	}
	return string(fs.data[start:fs.idx])
}

func main() {
	fs := NewFastScanner()

	n := fs.Int()
	m := fs.Int()
	k := fs.Int()

	sa := fs.String()
	sb := fs.String()

	onesA := 0
	onesB := 0
	for i := 0; i < k; i++ {
		if sa[i] == '1' {
			onesA++
		}
		if sb[i] == '1' {
			onesB++
		}
	}

	x1 := onesA
	if onesB < x1 {
		x1 = onesB
	}
	x0 := k - onesA
	if k-onesB < x0 {
		x0 = k - onesB
	}

	chosen := byte('1')
	if x0 < x1 {
		chosen = '0'
	}

	aMask := 0
	bMask := 0
	c1 := 0
	c2 := 0
	for i := 0; i < k; i++ {
		if sa[i] == chosen {
			aMask |= 1 << i
			c1++
		}
		if sb[i] == chosen {
			bMask |= 1 << i
			c2++
		}
	}

	as := make([]uint8, n)
	bs := make([]uint8, n)
	for i := 0; i < n; i++ {
		as[i] = uint8(fs.Int() - 1)
		bs[i] = uint8(fs.Int() - 1)
	}

	size := 1 << k
	inf := int32(n + 1)

	f := make([]int32, size)
	for i := 0; i < size; i++ {
		f[i] = inf
	}

	var perm [20]uint8
	for i := 0; i < k; i++ {
		perm[i] = uint8(i)
	}

	mask := aMask
	f[mask] = 0
	for i := 0; i < n; i++ {
		a := as[i]
		b := bs[i]
		p := int(perm[a])
		q := int(perm[b])
		if ((mask >> p) & 1) != ((mask >> q) & 1) {
			mask ^= (1 << p) | (1 << q)
		}
		perm[a], perm[b] = perm[b], perm[a]
		idx := int32(i + 1)
		if idx < f[mask] {
			f[mask] = idx
		}
	}

	for bit := 0; bit < k; bit++ {
		step := 1 << bit
		jump := step << 1
		for base := 0; base < size; base += jump {
			right := base + step
			for off := 0; off < step; off++ {
				i1 := base + off
				v := f[right+off]
				if v < f[i1] {
					f[i1] = v
				}
			}
		}
	}

	popc := make([]uint8, size)
	for i := 1; i < size; i++ {
		popc[i] = popc[i>>1] + uint8(i&1)
	}

	maxX := c1
	if c2 < maxX {
		maxX = c2
	}

	times := make([][]int32, maxX+1)
	if maxX > 0 {
		all := make([]int32, maxX*size)
		for x := 1; x <= maxX; x++ {
			arr := all[(x-1)*size : x*size]
			times[x] = arr
			want := uint8(x)
			for i := 0; i < size; i++ {
				if popc[i] == want {
					arr[i] = f[i]
				} else {
					arr[i] = inf
				}
			}
			for bit := 0; bit < k; bit++ {
				step := 1 << bit
				jump := step << 1
				for base := 0; base < size; base += jump {
					right := base + step
					for off := 0; off < step; off++ {
						v := arr[base+off]
						i1 := right + off
						if v < arr[i1] {
							arr[i1] = v
						}
					}
				}
			}
		}
	}

	for i := 0; i < k; i++ {
		perm[i] = uint8(i)
	}

	mask = bMask
	baseScore := k - c1 - c2
	bestScore := -1
	ansL := 1
	ansR := m

	for i := 0; i < n; i++ {
		a := as[i]
		b := bs[i]
		p := int(perm[a])
		q := int(perm[b])
		if ((mask >> p) & 1) != ((mask >> q) & 1) {
			mask ^= (1 << p) | (1 << q)
		}
		perm[a], perm[b] = perm[b], perm[a]

		r := i + 1
		if r < m {
			continue
		}

		limit := int32(r - m)
		bestX := 0
		bestI := 0
		for x := maxX; x >= 1; x-- {
			idx := times[x][mask]
			if idx <= limit {
				bestX = x
				bestI = int(idx)
				break
			}
		}

		score := baseScore + bestX + bestX
		if score > bestScore {
			bestScore = score
			ansL = bestI + 1
			ansR = r
			if score == k {
				break
			}
		}
	}

	out := bufio.NewWriterSize(os.Stdout, 1<<20)
	fmt.Fprintln(out, bestScore)
	fmt.Fprintln(out, ansL, ansR)
	out.Flush()
}