Pagini recente » Cod sursa (job #1435612) | Cod sursa (job #2242083) | Cod sursa (job #2578174) | Cod sursa (job #2960351) | Cod sursa (job #3338456)
#include <fstream>
#include <vector>
#include <cstring>
using namespace std;
ifstream fin("ahocorasick.in");
ofstream fout("ahocorasick.out");
const int NMAX = 1000005;
int tr[NMAX][26], fail[NMAX], cnt[NMAX];
int q_bfs[NMAX], pos[105];
int nodes = 0;
string A, word;
int n;
void insert(const string &s, int idx) {
int u = 0;
for (char c : s) {
int v = c - 'a';
if (!tr[u][v]) tr[u][v] = ++nodes;
u = tr[u][v];
}
pos[idx] = u;
}
void build_ac() {
int head = 0, tail = 0;
for (int i = 0; i < 26; ++i) {
if (tr[0][i]) q_bfs[tail++] = tr[0][i];
}
while (head < tail) {
int u = q_bfs[head++];
for (int i = 0; i < 26; ++i) {
if (tr[u][i]) {
fail[tr[u][i]] = tr[fail[u]][i];
q_bfs[tail++] = tr[u][i];
} else {
tr[u][i] = tr[fail[u]][i];
}
}
}
}
int main() {
fin >> A >> n;
for (int i = 1; i <= n; ++i) {
fin >> word;
insert(word, i);
}
build_ac();
int u = 0;
for (char c : A) {
u = tr[u][c - 'a'];
cnt[u]++;
}
for (int i = nodes - 1; i >= 0; --i) {
int u = q_bfs[i];
cnt[fail[u]] += cnt[u];
}
for (int i = 1; i <= n; ++i) {
fout << cnt[pos[i]] << '\n';
}
return 0;
}