func_code_string: #include <bits/stdc++.h>   using namespace std;   const int N = 1000009;   const int SGZ = 26;   const int M = 10009;   int n, m, nxt[N][SGZ], crt[N][SGZ], q[M], ans[M];   vector<int> val;   char s[N], qy[SGZ];   inline int read() {     char c = getchar();     int ret = 0, f = 1;     while (c <  0  || c >  9 ) {       f = c ==  -  ? -1 : 1;       c = getchar();     }     while ( 0  <= c && c <=  9 ) {       ret = ret * 10 + c -  0 ;       c = getchar();     }     return ret * f;   }   inline int index(int x) {     for (int l = 0, r = val.size() - 1, mid; l <= r;) {       mid = l + r >> 1;       if (val[mid] == x) {         return mid;       } else if (val[mid] < x) {         l = mid + 1;       } else {         r = mid - 1;       }     }     return -1;   }   int main() {     scanf( %s , s);     n = strlen(s);     m = read();     for (int i = 1; i <= m; i++) {       scanf( %s , qy);       int len = strlen(qy);       for (int j = 0; j < len; j++) {         q[i] |= 1 << qy[j] -  a ;       }       val.push_back(q[i]);     }     sort(val.begin(), val.end());     val.resize(unique(val.begin(), val.end()) - val.begin());     int last_position[SGZ];     fill(last_position, last_position + SGZ, n);     for (int i = n - 1; ~i; i--) {       last_position[s[i] -  a ] = i;       for (int j = 0; j < SGZ; j++) {         nxt[i][j] = last_position[j];       }     }     memset(crt, -1, sizeof(crt));     for (int i = 0; i < n; i++) {       for (int j = 0, p = i, sta = 0; j < 26 && p < n; j++) {         int np = n, c = -1;         for (int k = 0; k < 26; k++) {           if ((sta >> k & 1) == 0) {             if (np > nxt[p][k]) {               c = k;               np = nxt[p][k];             }           }         }         if (~c) {           sta |= 1 << c;           p = np;           crt[i][j] = sta;           if (!i || crt[i - 1][j] != sta) {             int idx = index(sta);             if (~idx) {               ans[idx]++;             }           }         }       }     }     for (int i = 1; i <= m; i++) {       printf( %d n , ans[index(q[i])]);     }     return 0;   }   