func_code_string: #include <bits/stdc++.h>   using namespace std;   const int MAX = 2e6 + 5;   int ends_here[MAX];   int qs, qe;   struct data {     int child[26];     int score;     bool leaf;     int suf;     int ends;   };   data arr[MAX];   int que[MAX];   int cur;   struct aho_corasick {     int root;     int size;     void init() { root = (++cur); }     void insert(string s, int ind) {       int node = root;       for (int i = 0; i < s.length(); i++) {         int c = s[i] -  a ;         if (!arr[node].child[c]) {           arr[node].child[c] = (++cur);         }         node = arr[node].child[c];       }       ++size;       arr[node].leaf = 1;       arr[node].ends = ind;     }     int find(int node, int c) {       while (node != root) {         if (arr[node].child[c]) {           return arr[node].child[c];         }         node = arr[node].suf;       }       if (arr[root].child[c]) {         return arr[root].child[c];       } else {         return root;       }     }     void prepare() {       qs = 0;       qe = 0;       que[qe++] = root;       arr[root].suf = root;       while (qs < qe) {         int node = que[qs++];         for (int i = 0; i < 26; i++) {           if (arr[node].child[i]) {             int nxt = arr[node].child[i];             if (node != root) {               arr[nxt].suf = find(arr[node].suf, i);             } else {               arr[nxt].suf = root;             }             arr[nxt].score = arr[arr[nxt].suf].score + arr[nxt].leaf;             que[qe++] = nxt;           }         }       }     }     long long query(string s) {       int node = root;       long long ans = 0;       for (int i = 0; i < s.length(); i++) {         int c = s[i] -  a ;         node = find(node, c);         ans += arr[node].score;       }       return ans;     }     void dfs(int s1, int s2) {       arr[s1].leaf |= arr[s2].leaf;       for (int i = 0; i < 26; i++) {         if (!arr[s2].child[i]) {           continue;         }         if (!arr[s1].child[i]) {           arr[s1].child[i] = arr[s2].child[i];           continue;         }         dfs(arr[s1].child[i], arr[s2].child[i]);       }     }     void merge(aho_corasick other) {       dfs(root, other.root);       size += other.size;     }   };   int n, k;   set<int> pos;   vector<int> hlp;   void check(int ind) {     int f = 0;     for (int i = ind;; i += k) {       if (ends_here[i + k - 1] == 0) {         f = 1;         break;       }       if (pos.find(ends_here[i + k - 1]) != pos.end()) {         f = 1;         break;       }       pos.insert(ends_here[i + k - 1]);       hlp.push_back(ends_here[i + k - 1]);       if (pos.size() == n) {         break;       }     }     if (f == 0) {       printf( YES n );       for (auto x : hlp) {         printf( %d  , x);       }       exit(0);     } else {       pos.clear();       hlp.clear();     }   }   string str[100005];   int main() {     aho_corasick a;     a.init();     scanf( %d %d , &n, &k);     string s;     cin >> s;     s = s + s;     int m;     scanf( %d , &m);     for (int i = 1; i <= m; i++) {       cin >> str[i];       a.insert(str[i], i);     }     a.prepare();     int st = a.root;     for (int i = 0; i < s.length(); i++) {       int c = s[i] -  a ;       st = a.find(st, c);       if (arr[st].score > 0) {         ends_here[i] = arr[st].ends;       }     }     for (int i = 0; i < k; i++) {       check(i);     }     printf( NO n );     return 0;   }   