Pagini recente » Cod sursa (job #2750202) | Cod sursa (job #3263611) | Cod sursa (job #3275208) | Cod sursa (job #2190560) | Cod sursa (job #2985516)
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 5, M = 105;
int trie[N][26], fail[N], len[M], cnt[N], ans[M];
int n, idx = 0;
char A[N], s[M][M];
void insertTrie(int id) {
int cur = 0;
for (int i = 0; i < len[id]; ++i) {
int c = s[id][i] - 'a';
if (!trie[cur][c]) trie[cur][c] = ++idx;
cur = trie[cur][c];
}
cnt[cur] = id;
}
void buildFail() {
queue<int> q;
for (int c = 0; c < 26; ++c) {
int u = trie[0][c];
if (u) q.push(u);
}
while (!q.empty()) {
int u = q.front();
q.pop();
for (int c = 0; c < 26; ++c) {
int v = trie[u][c], f = fail[u];
if (!v) {
trie[u][c] = trie[f][c];
continue;
}
fail[v] = trie[f][c];
q.push(v);
}
}
}
void match() {
int cur = 0;
for (int i = 0; A[i]; ++i) {
int c = A[i] - 'a';
cur = trie[cur][c];
for (int j = cur; j; j = fail[j]) {
if (cnt[j]) ++ans[cnt[j]];
}
}
}
int main() {
ifstream cin("ahocorasick.in");
ofstream cout("ahocorasick.out");
cin >> A >> n;
for (int i = 1; i <= n; ++i) {
cin >> s[i];
len[i] = strlen(s[i]);
insertTrie(i);
}
buildFail();
match();
for (int i = 1; i <= n; ++i) {
cout << ans[i] << '\n';
}
return 0;
}