#include <bits/stdc++.h>
using namespace std;
template <typename T, typename D>
std::ostream& operator<<(std::ostream& os, const std::pair<T, D>& p) {
  return os << "(" << p.first << ", " << p.second << ")";
}
template <long long M>
struct Mod {
  long long mod = M;
  long long x;
  Mod(long long xx) : x(xx) {}
  Mod operator+(Mod b) { return Mod((x + b.x) % mod); }
  Mod operator-(Mod b) { return Mod((x - b.x + mod) % mod); }
  Mod operator*(Mod b) { return Mod((x * b.x) % mod); }
  Mod operator/(Mod b) { return *this * b.invert(); }
  Mod invert() { return *this ^ (M - 2); }
  Mod operator^(long long e) {
    if (!e) return Mod(1);
    Mod r = *this ^ (e / 2);
    r = r * r;
    return e & 1 ? *this * r : r;
  }
  bool operator==(const Mod& o) const { return x == o.x; }
  bool operator<(const Mod& o) const { return x < o.x; }
};
template <long long M>
std::ostream& operator<<(std::ostream& os, const Mod<M>& x) {
  return os << x.x;
};
struct Hash {
  static const int MA = 1e9 + 7, MB = 1e9 + 9;
  Mod<MA> a;
  Mod<MB> b;
  Hash() : a(0), b(0) {}
  Hash(long long aa, long long bb) : a(aa), b(bb) {}
  Hash(Mod<MA> aa, Mod<MB> bb) : a(aa.x), b(bb.x) {}
  static Hash ch(char c) { return Hash(c - 'a' + 1, c - 'a' + 1); }
  Hash operator+(Hash o) { return Hash(a + o.a, b + o.b); }
  Hash operator-(Hash o) { return Hash(a - o.a, b - o.b); }
  Hash operator*(Hash o) { return Hash(a * o.a, b * o.b); }
  Hash operator^(long long e) { return Hash(a ^ e, b ^ e); }
  Hash invert() { return Hash(a.invert(), b.invert()); }
  bool operator==(const Hash& o) const { return a == o.a && b == o.b; }
  bool operator<(const Hash& o) const {
    return a < o.a || (a == o.a && b < o.b);
  }
};
std::ostream& operator<<(std::ostream& os, const Hash& x) {
  return os << make_pair(x.a, x.b);
};
const int MAXM = 1e6 + 2;
Hash P[MAXM];
void init_ps() {
  P[0] = Hash(1, 1);
  for (int i = (1); i < (MAXM); i++) P[i] = P[i - 1] * Hash(31, 53);
}
Hash hsh(string& s) {
  Hash h = Hash(0, 0);
  for (int i = (0); i < ((int)(s).size()); i++) h = h + Hash::ch(s[i]) * P[i];
  return h;
}
struct hasher {
  std::size_t operator()(const Hash& h) const { return h.a.x ^ h.b.x; }
};
int main() {
  ios::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  init_ps();
  int n, k;
  cin >> n >> k;
  string cd;
  cin >> cd;
  int gn;
  cin >> gn;
  unordered_map<Hash, int, hasher> g;
  for (int i = (0); i < (gn); i++) {
    string s;
    cin >> s;
    g[hsh(s)] = i + 1;
  }
  vector<Hash> hs(n);
  for (int i = (0); i < (n); i++) {
    string s = cd.substr(i * k, k);
    hs[i] = hsh(s);
  }
  for (int io = (0); io < (k); io++) {
    bool included;
    unordered_set<Hash, hasher> hs_set((hs).begin(), (hs).end());
    if ((int)(hs_set).size() != n) goto next;
    included = true;
    for (auto& h : hs) {
      if (g.find(h) == g.end()) {
        included = false;
        break;
      }
    }
    if (!included) goto next;
    cout << "YES\n";
    for (auto& h : hs) {
      cout << g[h] << " ";
    }
    cout << "\n";
    return 0;
  next:
    for (int i = (0); i < (n); i++) {
      int start_i = i * k + io;
      hs[i] = (hs[i] - Hash::ch(cd[start_i])) * P[1].invert();
      hs[i] = hs[i] + Hash::ch(cd[(start_i + k) % (n * k)]) * P[k - 1];
    }
  }
  cout << "NO\n";
}
