Pagini recente » Cod sursa (job #879648) | Cod sursa (job #15301) | Cod sursa (job #41582) | Cod sursa (job #149032) | Cod sursa (job #3209564)
#include <bits/stdc++.h>
#define int unsigned int
#define MAX 1000001
#define base 666013
#define eb emplace_back
using namespace std;
const string fn("ahocorasick");
ifstream in(fn + ".in");
ofstream out(fn + ".out");
#define cin in
#define cout out
string s, t, ans;
int fact[MAX], _hash[MAX], _1[201], _2[40401];
int n, i, nh, mx, q;
vector<int> g[100001];
int get_hash(int st, int dr)
{
int answer = (_hash[dr + 1] - _hash[st] * fact[dr - st + 1]);
return answer;
}
signed main()
{
cin >> s;
fact[0] = 1;
for (i = 1; i <= s.size(); i++)
fact[i] = (fact[i - 1] * base);
_hash[2] = s[0];
for (i = 2; i <= s.size(); i++)
_hash[i + 1] = (_hash[i] * base + s[i - 1]);
for (i = 0; i < s.size() - 2; i++)
{
int aux = (s[i] * 4) + s[i + 1] * 2 + s[i + 2];
g[aux].eb(i + 1);
_1[s[i]] += 1;
aux = s[i] * 100 + s[i + 1];
_2[aux]++;
}
_1[s[s.size() - 1]]++;
_1[s[s.size() - 2]]++;
int aux = s[s.size() - 2] * 100 + s[s.size() - 1];
_2[aux]++;
cin >> q;
while (q--)
{
cin >> t;
nh = 0;
for (i = 0; i < t.size(); i++)
nh = (nh * base + t[i]);
if (t.size() == 1)
{
int mx=0;
if (_1[t[0]] > mx)
mx = _1[t[0]];
cout<<mx<<'\n';
}
else if (t.size() == 2)
{
int aux = t[0] * 100 + t[1];
int mx=0;
if (_2[aux] > mx)
mx = _2[aux];
cout<<mx<<'\n';
}
else
{
int aux = t[0] * 4 + t[1] * 2 + t[2];
int cnt = 0;
for (auto x : g[aux])
{
if (x + t.size() - 1 > s.size())
break;
if (get_hash(x, x + t.size() - 1) == nh)
++cnt;
}
cout<<cnt<<'\n';
}
}
return 0;
}