#include <bits/stdc++.h>
using namespace std;
const int N = (int)2e6 + 7;
char c[N];
struct super_hash {
  vector<int> h[2], p[2];
  int m[2], b[2];
  super_hash(string s, int m1, int m2, int b1, int b2) {
    m[0] = m1, m[1] = m2;
    b[0] = b1, b[2] = b2;
    int n = s.size();
    for (int t = 0; t < 2; t++) {
      h[t].resize(n + 1);
      p[t].resize(n + 1);
      p[t][0] = 1;
      h[t][0] = 0;
      for (int i = 1; i <= n; i++) {
        h[t][i] = (h[t][i - 1] * (long long)b[t] + s[i - 1]) % m[t];
        p[t][i] = (p[t][i - 1] * (long long)b[t]) % m[t];
      }
    }
  }
  pair<int, int> get(int l, int r) {
    int res[2];
    for (int t = 0; t < 2; t++) {
      res[t] = (h[t][r] - (h[t][l] * (long long)p[t][r - l]) % m[t]);
      if (res[t] < 0) res[t] += m[t];
    }
    return {res[0], res[1]};
  }
};
bool prime(int x) {
  for (int i = 2; i * i <= x; i++)
    if (x % i == 0) return false;
  return true;
}
int get_prime(int x) {
  x += rand();
  while (!prime(x)) x--;
  return x;
}
int get_mod() { return get_prime(1000000000); }
int get_base() { return get_prime(239); }
map<pair<int, int>, int> num;
string nxt() {
  scanf(" %s", c);
  return string(c);
}
int main() {
  srand(time(NULL));
  int m[2], b[2];
  for (int t = 0; t < 2; t++) {
    m[t] = get_mod();
    b[t] = get_base();
  }
  int n, k;
  scanf("%d%d", &n, &k);
  vector<int> ans[k];
  set<int> res[k];
  string s = nxt();
  for (int i = 0; i < k; i++) s += s[i];
  int g;
  scanf("%d", &g);
  for (int i = 1; i <= g; i++) {
    string t = nxt();
    super_hash h(t, m[0], m[1], b[0], b[1]);
    num[h.get(0, k)] = i;
  }
  super_hash h(s, m[0], m[1], b[0], b[1]);
  for (int i = 0; i < n * k; i++) {
    int f = num[h.get(i, i + k)];
    if (!f) continue;
    res[i % k].insert(f);
    ans[i % k].push_back(f);
  }
  for (int i = 0; i < k; i++) {
    if ((int)res[i].size() == n) {
      puts("YES");
      for (auto c : ans[i]) {
        printf("%d ", c);
      }
      puts("");
      return 0;
    }
  }
  puts("NO");
}
