← Home
package main

import (
	"io"
	"os"
	"sort"
	"strconv"
	"strings"
)

func main() {
	data, _ := io.ReadAll(os.Stdin)
	pos := 0
	nextInt := func() int {
		for pos < len(data) && (data[pos] < '0' || data[pos] > '9') {
			pos++
		}
		val := 0
		for pos < len(data) && data[pos] >= '0' && data[pos] <= '9' {
			val = val*10 + int(data[pos]-'0')
			pos++
		}
		return val
	}

	n := nextInt()
	m := nextInt()
	p := nextInt()

	a := make([]int, n)
	for i := 0; i < n; i++ {
		a[i] = nextInt()
	}

	id := make(map[int]int, m)
	need := make([]int, 0, m)
	for i := 0; i < m; i++ {
		x := nextInt()
		if idx, ok := id[x]; ok {
			need[idx]++
		} else {
			id[x] = len(need)
			need = append(need, 1)
		}
	}

	k := len(need)
	mapped := make([]int, n)
	for i, x := range a {
		if idx, ok := id[x]; ok {
			mapped[i] = idx
		} else {
			mapped[i] = -1
		}
	}

	cnt := make([]int, k)
	vis := make([]int, k)
	window := make([]int, m)
	ans := make([]int, 0)
	ver := 1

	for r := 0; r < p && r < n; r++ {
		good := 0
		bad := 0
		t := 0

		for idx := r; idx < n; idx += p {
			if t >= m {
				old := window[t%m]
				if old == -1 {
					bad--
				} else {
					if vis[old] != ver {
						vis[old] = ver
						cnt[old] = 0
					}
					if cnt[old] == need[old] {
						good--
					}
					cnt[old]--
					if cnt[old] == need[old] {
						good++
					}
				}
			}

			v := mapped[idx]
			if v == -1 {
				bad++
			} else {
				if vis[v] != ver {
					vis[v] = ver
					cnt[v] = 0
				}
				if cnt[v] == need[v] {
					good--
				}
				cnt[v]++
				if cnt[v] == need[v] {
					good++
				}
			}

			window[t%m] = v

			if t >= m-1 && bad == 0 && good == k {
				startT := t - m + 1
				ans = append(ans, r+1+startT*p)
			}
			t++
		}
		ver++
	}

	sort.Ints(ans)

	var sb strings.Builder
	sb.WriteString(strconv.Itoa(len(ans)))
	sb.WriteByte('\n')
	for i, v := range ans {
		if i > 0 {
			sb.WriteByte(' ')
		}
		sb.WriteString(strconv.Itoa(v))
	}
	sb.WriteByte('\n')
	os.Stdout.WriteString(sb.String())
}