func_code_string: #include <bits/stdc++.h>   using namespace std;   struct Node {     int id, fail, next[26];     void init() {       id = -1;       fail = -1;       memset(next, 0, sizeof(int) * 26);     }   } node[2000050];   int e;   void insert(char *str, int id) {     int len = strlen(str);     int pos = 0;     for (int i = 0; i < len; i++) {       int tmp = str[i] -  a ;       if (node[pos].next[tmp] == 0) {         node[++e].init();         node[pos].next[tmp] = e;       }       pos = node[pos].next[tmp];     }     node[pos].id = id;   }   int head, tail, q[2000050];   void bfs() {     head = tail = 0;     q[tail++] = 0;     while (head < tail) {       int u = q[head++];       for (int i = 0; i < 26; i++) {         if (node[u].next[i]) {           int tmp = node[u].fail;           while (tmp != -1 && node[tmp].next[i] == 0) tmp = node[tmp].fail;           if (tmp == -1)             tmp = 0;           else             tmp = node[tmp].next[i];           node[node[u].next[i]].fail = tmp;           q[tail++] = node[u].next[i];         }       }     }   }   int n, k, g;   char record[2000050];   char word[2000050];   int dp[2000050];   int ans[2000050];   int cnt[2000050];   void solve() {     memcpy(record + k * n, record, k * n);     memset(dp, -1, sizeof(int) * (n * k));     int pos = 0;     for (int i = 0; i < k * n * 2; i++) {       while (pos != 0 && node[pos].next[record[i] -  a ] == 0)         pos = node[pos].fail;       pos = node[pos].next[record[i] -  a ];       if (node[pos].id != -1) dp[i % (n * k)] = node[pos].id;     }     memset(cnt, 0, sizeof(int) * g);     for (int st = 0; st < k; st++) {       bool flag = true;       pos = st;       for (int i = 0; i < n; i++) {         if (dp[pos] == -1 || cnt[dp[pos]] > 0) {           flag = false;           while (pos >= 0) {             cnt[dp[pos]] = 0;             pos -= k;           }           break;         }         cnt[dp[pos]] = 1;         ans[i] = dp[pos] + 1;         pos += k;       }       if (flag) {         printf( YES n );         for (int i = 0; i < n; i++) printf( %d  , ans[i]);         printf(  n );         return;       }     }     printf( NO n );   }   int main() {     while (scanf( %d%d , &n, &k) == 2) {       scanf( %s , record);       scanf( %d , &g);       e = 0;       node[0].init();       for (int i = 0; i < g; i++) {         scanf( %s , word);         insert(word, i);       }       bfs();       solve();     }   }   