#include <bits/stdc++.h>
#pragma comment(linker, "/STACK:102400000000,102400000000")
using namespace std;
const int INF = 0x3f3f3f3f;
const double eps = 1e-10;
const int MAXN = 200010;
int n, m, q;
int a[MAXN];
map<int, int> mb, ma;
vector<int> ans;
void solve(int st) {
  if (st + (m - 1) * st > n) return;
  ma.clear();
  int cnt = 0;
  int x;
  for (int nx = 0; nx < m - 1 && st <= n; nx++) {
    x = a[st];
    ma[x]++;
    if (mb.count(x)) {
      if (ma[x] == mb[x])
        cnt++;
      else if (ma[x] == mb[x] + 1)
        cnt--;
    } else
      cnt--;
    st += q;
  }
  for (int i = st; i <= n; i += q) {
    x = a[i];
    ma[x]++;
    if (mb.count(x)) {
      if (ma[x] == mb[x])
        cnt++;
      else if (ma[x] == mb[x] + 1)
        cnt--;
    } else
      cnt--;
    if (cnt == mb.size()) ans.push_back(i - (m - 1) * q);
    int j = i - (m - 1) * q;
    x = a[j];
    ma[x]--;
    if (mb.count(x)) {
      if (ma[x] == mb[x])
        cnt++;
      else if (ma[x] == mb[x] - 1)
        cnt--;
    } else
      cnt++;
  }
}
int main() {
  int x;
  scanf("%d%d%d", &n, &m, &q);
  for (int i = (1); i <= (n); ++i) scanf("%d", &a[i]);
  for (int i = (1); i <= (m); ++i) scanf("%d", &x), mb[x]++;
  for (int i = 1; i <= q; i++) {
    solve(i);
  }
  sort(ans.begin(), ans.end());
  printf("%d\n", ans.size());
  for (int i = 0; i < (ans.size()); ++i)
    printf("%d%c", ans[i], i == ans.size() - 1 ? '\n' : ' ');
  return 0;
}
