#include <set>
#include <string>
#include <unordered_map>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define File(_) freopen(#_".in", "r", stdin);freopen(#_".out", "w", stdout)
#define Debug(_) freopen(#_".in", "r", stdin);freopen("debug.out", "w", stdout)
#define fo(i, a, b) for (int i = a; i <= b; ++i)
#define fd(i, a, b) for (int i = a; i >= b; --i)
#define init(a, b) memset(a, b, sizeof a)
#define gc getchar()
#define N 100010
#define mod1 1000000007
#define mod2 1000000009
#define inf 0x3f3f3f3f
#define db double
#define ll long long
using namespace std;
char s[N];
int cnt, num[500], bz[N], qs1[N], qs2[N], sum1[N], sum2[N], pw1[N], pw2[N];
unordered_map <pair<int, int>, pair<int, int> > mp;
int main()
{
File(language);
int n, q;
scanf("%s", s + 1);
n = strlen(s + 1);
scanf("%d", &q);
pw1[0] = pw2[0] = 1;
fo (i, 1, n)
{
pw1[i] = pw1[i - 1] * 31 % mod1;
pw2[i] = pw2[i - 1] * 29 % mod2;
}
fo (i, 1, q)
{
string ea;
cin >> ea;
int lim = ea.size();
fo (j, 0, lim - 1)
{
qs1[i] = (qs1[i] * 31 % mod1 + ea[i] - 'a' + 1) % mod1;
qs2[i] = (qs2[i] * 29 % mod2 + ea[i] - 'a' + 1) % mod2;
}
mp[make_pair(qs1[i], qs2[i])].first = 1;
}
fo (i, 1, n)
{
sum1[i] = (sum1[i - 1] * 31 % mod1 + s[i] - 'a' + 1) % mod1;
sum2[i] = (sum2[i - 1] * 29 % mod2 + s[i] - 'a' + 1) % mod2;
fo (j, 1, cnt)
if (num[j] <= i)
{
pair <int, int> mos = make_pair(sum1[i] - sum1[i - num[j]] * pw1[num[j]] % mod1, sum2[i] - sum2[i - num[j]] * pw2[num[j]] % mod2);
if (mp[mos].first && mp[mos].second <= i - num[j])
{
++mp[mos].first;
mp[mos].second = i;
}
}
}
fo (i, 1, q)
printf("%d\n", mp[make_pair(qs1[i], qs2[i])].first - 1);
return 0;
}
用unordered_map做双哈希,编译过不去,求助大佬是什么原因