func_code_string: #include <bits/stdc++.h>   using namespace std;   using ll = long long;   const int maxn = 2e6 + 5;   char s[maxn], t[maxn];   int m;   struct Suffixam {     struct state {       int len, link;       map<char, int> next;     };     int id[maxn << 1], size[maxn << 1], cnt[maxn << 1];     state st[maxn << 1];     int last, sz;     int vis[maxn << 1];     void sam_init() {       memset(vis, -1, sizeof(vis));       sz = 0;       st[0].len = 0;       st[0].link = -1;       st[0].next.clear();       sz++;       last = 0;     }     void sam_extend(char c) {       int cur = sz++;       st[cur].len = st[last].len + 1;       st[cur].next.clear();       size[cur] = 1;       int p = last;       while (~p && !st[p].next.count(c)) {         st[p].next[c] = cur;         p = st[p].link;       }       if (p == -1) {         st[cur].link = 0;       } else {         int q = st[p].next[c];         if (st[p].len + 1 == st[q].len) {           st[cur].link = q;         } else {           int clone = sz++;           st[clone].len = st[p].len + 1;           st[clone].next = st[q].next;           st[clone].link = st[q].link;           while (~p && st[p].next[c] == q) {             st[p].next[c] = clone;             p = st[p].link;           }           st[q].link = st[cur].link = clone;         }       }       last = cur;     }     void get() {       for (int i = 1; i < sz; ++i) {         ++cnt[st[i].len];       }       for (int i = 1; i < sz; ++i) {         cnt[i] += cnt[i - 1];       }       for (int i = 1; i < sz; ++i) {         id[cnt[st[i].len]--] = i;       }       for (int i = sz; i >= 1; --i) {         size[st[id[i]].link] += size[id[i]];       }     }     void solve(const char *ss, int x) {       ll ans = 0;       int len = 0, now = 0;       for (int i = 0; ss[i]; ++i) {         if (st[now].next.count(ss[i]) != 0) {           now = st[now].next[ss[i]];           len++;           while (~now && st[st[now].link].len >= m) {             now = st[now].link;             len = st[now].len;           }           if (vis[now] != x && len >= m) {             ans += size[now];             vis[now] = x;           }         } else {           while (~now && !st[now].next.count(ss[i])) {             now = st[now].link;           }           if (now != -1) {             len = st[now].len + 1;             now = st[now].next[ss[i]];           } else {             len = 0;             now = 0;           }           while (~now && st[st[now].link].len >= m) {             now = st[now].link;             len = st[now].len;           }           if (vis[now] != x && len >= m) {             ans += size[now];             vis[now] = x;           }         }       }       printf( %lld n , ans);     }   } sam;   int main() {     scanf( %s , s + 1);     int n = strlen(s + 1);     sam.sam_init();     for (int i = 1; i <= n; ++i) {       sam.sam_extend(s[i]);     }     sam.get();     int q;     scanf( %d , &q);     while (q--) {       scanf( %s , t + 1);       m = strlen(t + 1);       for (int i = 1; i <= m; ++i) {         t[i + m] = t[i];       }       t[2 * m + 1] = 0;       sam.solve(t + 1, q);     }     return 0;   }   