← Home
package main

import (
	"bufio"
	"io"
	"os"
	"runtime/debug"
	"strconv"
)

const (
	B1 uint64 = 11400714819323198485
	B2 uint64 = 14029467366897019727
)

func htIndex(h1, h2 uint64) int {
	return int((h1^(h1>>33)^h2^(h2>>29)) & 63)
}

func htInsert(k1, k2 *[64]uint64, v *[64]int8, h1, h2 uint64, x int8) {
	i := htIndex(h1, h2)
	for v[i] != 0 {
		if k1[i] == h1 && k2[i] == h2 {
			v[i] = x
			return
		}
		i = (i + 1) & 63
	}
	k1[i] = h1
	k2[i] = h2
	v[i] = x
}

func htFind(k1, k2 *[64]uint64, v *[64]int8, h1, h2 uint64) int8 {
	i := htIndex(h1, h2)
	for {
		if v[i] == 0 {
			return 0
		}
		if k1[i] == h1 && k2[i] == h2 {
			return v[i]
		}
		i = (i + 1) & 63
	}
}

func main() {
	debug.SetGCPercent(-1)

	data, _ := io.ReadAll(os.Stdin)
	p := 0

	readInt := func() int {
		for p < len(data) && data[p] <= 32 {
			p++
		}
		n := 0
		for p < len(data) && data[p] > 32 {
			n = n*10 + int(data[p]-'0')
			p++
		}
		return n
	}

	readString := func() string {
		for p < len(data) && data[p] <= 32 {
			p++
		}
		start := p
		for p < len(data) && data[p] > 32 {
			p++
		}
		return string(data[start:p])
	}

	n := readInt()
	m := readInt()
	s := readString()
	t := readString()

	powM1, powM2 := uint64(1), uint64(1)
	for i := 0; i < m; i++ {
		powM1 *= B1
		powM2 *= B2
	}

	var pref1 [26][]uint64
	var pref2 [26][]uint64

	for c := 0; c < 26; c++ {
		a1 := make([]uint64, n+1)
		a2 := make([]uint64, n+1)
		ch := byte('a' + c)
		var h1, h2 uint64
		for i := 0; i < n; i++ {
			var bit uint64
			if s[i] == ch {
				bit = 1
			}
			h1 = h1*B1 + bit
			h2 = h2*B2 + bit
			a1[i+1] = h1
			a2[i+1] = h2
		}
		pref1[c] = a1
		pref2[c] = a2
	}

	var tk1, tk2 [64]uint64
	var tv [64]int8

	for c := 0; c < 26; c++ {
		ch := byte('a' + c)
		var h1, h2 uint64
		for i := 0; i < m; i++ {
			var bit uint64
			if t[i] == ch {
				bit = 1
			}
			h1 = h1*B1 + bit
			h2 = h2*B2 + bit
		}
		if h1 != 0 || h2 != 0 {
			htInsert(&tk1, &tk2, &tv, h1, h2, int8(c+1))
		}
	}

	ans := make([]int, 0, n-m+1)

	for l := 0; l+m <= n; l++ {
		r := l + m
		var g [26]byte
		var mask uint32
		ok := true

		for a := 0; a < 26; a++ {
			p1 := pref1[a]
			p2 := pref2[a]
			h1 := p1[r] - p1[l]*powM1
			h2 := p2[r] - p2[l]*powM2
			if h1 == 0 && h2 == 0 {
				continue
			}
			b := htFind(&tk1, &tk2, &tv, h1, h2)
			if b == 0 {
				ok = false
				break
			}
			mask |= uint32(1) << uint(a)
			g[a] = byte(b - 1)
		}

		if ok {
			for a := 0; a < 26; a++ {
				if mask&(uint32(1)<<uint(a)) == 0 {
					continue
				}
				b := int(g[a])
				if b != a && (mask&(uint32(1)<<uint(b))) != 0 && int(g[b]) != a {
					ok = false
					break
				}
			}
		}

		if ok {
			ans = append(ans, l+1)
		}
	}

	out := make([]byte, 0, len(ans)*7+32)
	out = strconv.AppendInt(out, int64(len(ans)), 10)
	out = append(out, '\n')
	for i, v := range ans {
		if i > 0 {
			out = append(out, ' ')
		}
		out = strconv.AppendInt(out, int64(v), 10)
	}
	out = append(out, '\n')

	w := bufio.NewWriterSize(os.Stdout, 1<<20)
	w.Write(out)
	w.Flush()
}