Pagini recente » Cod sursa (job #1880454) | Cod sursa (job #648498) | Cod sursa (job #2289567) | Cod sursa (job #1002951) | Cod sursa (job #3357369)
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
using namespace std;
const int ALPHABET_SIZE = 26;
struct TrieNode {
struct TrieNode *children[ALPHABET_SIZE];
bool isLeaf;
vector<int> index;
};
TrieNode *getNode() {
TrieNode *node = new TrieNode;
node->isLeaf = false;
for (int i = 0; i < ALPHABET_SIZE; i++)
node->children[i] = NULL;
return node;
}
void insert(TrieNode *root, string key, int index) {
TrieNode *pCrawl = root;
for (int i = 0; i < key.length(); i++) {
int idx = key[i] - 'a';
if (!pCrawl->children[idx])
pCrawl->children[idx] = getNode();
pCrawl = pCrawl->children[idx];
pCrawl->index.push_back(i);
}
pCrawl->isLeaf = true;
}
void searchWord(TrieNode *root, string key) {
TrieNode *pCrawl = root;
for (int i = 0; i < key.length(); i++) {
int idx = key[i] - 'a';
if (!pCrawl->children[idx])
return;
pCrawl = pCrawl->children[idx];
}
for (int i = 0; i < pCrawl->index.size(); i++) {
cout << pCrawl->index[i] << " ";
}
}
int main() {
ifstream in("ahocorasick.in");
ofstream out("ahocorasick.out");
string text;
int n;
in >> text >> n;
TrieNode *root = getNode();
for (int i = 0; i < n; i++) {
string key;
in >> key;
insert(root, key, i);
}
for (int i = 0; i < text.length(); i++) {
searchWord(root, text.substr(i));
}
return 0;
}