Pagini recente » Cod sursa (job #2094725) | Cod sursa (job #3328585) | Cod sursa (job #2856706) | Cod sursa (job #2859455) | Cod sursa (job #3306676)
#include <bits/stdc++.h>
using namespace std;
struct TrieNode {
TrieNode* ch[26];
TrieNode* failure;
TrieNode* parent;
int lastch;
int dp;
TrieNode() {
lastch = -1;
dp = 0;
for (int i = 0; i < 26; i++) {
ch[i] = nullptr;
}
failure = parent = nullptr;
}
} *root;
string v[105];
void add(string a) {
TrieNode* curr = root;
for (auto c : a) {
if (curr->ch[c - 'a'] == nullptr) {
curr->ch[c - 'a'] = new TrieNode();
curr->ch[c - 'a']->parent = curr;
curr->ch[c - 'a']->lastch = (int) (c - 'a');
}
curr = curr->ch[c - 'a'];
}
}
stack<TrieNode*> st; //inverse order of bfs
void bfs() {
queue<TrieNode*> q;
q.push(root);
while (!q.empty()) {
TrieNode* curr = q.front();
st.push(curr);
q.pop();
if (curr == root) {
curr->failure = root;
}
else if (curr->parent == root) {
curr->failure = root;
}
else {
TrieNode* curr2 = curr->parent->failure;
char want = curr->lastch;
while (curr2 != root && curr2->ch[want] == nullptr) {
curr2 = curr2->parent->failure;
}
if (curr2->ch[want] != nullptr)
curr2 = curr2->ch[want];
curr->failure = curr2;
}
for (int i = 0; i < 26; i++) {
if (curr->ch[i] != nullptr)
q.push(curr->ch[i]);
}
}
}
void solve(string s) {
TrieNode* curr = root;
for (auto c : s) {
while (curr != root && curr->ch[c - 'a'] == nullptr) {
curr = curr->failure;
}
if (curr->ch[c - 'a'] != nullptr)
curr = curr->ch[c - 'a'];
curr->dp = (curr->dp) + 1;
}
while (!st.empty()) {
curr = st.top();
st.pop();
curr->failure->dp += curr->dp;
}
}
int main() {
root = new TrieNode();
string s;
cin >> s;
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> v[i];
add(v[i]);
}
bfs();
solve(s);
for (int i = 1; i <= n; i++) {
TrieNode* curr = root;
for (auto c : v[i]) {
curr = curr->ch[c - 'a'];
}
cout << curr->dp << '\n';
}
return 0;
}