Pagini recente » Cod sursa (job #325469) | Rating Dombos David (DavidDombos) | Cod sursa (job #1149678) | Cod sursa (job #781563) | Cod sursa (job #2034601)
#include <iostream>
#include <fstream>
#include <string>
#include <cstring>
#define SIGMA 26
using namespace std;
struct Trie_vertex {
unsigned int words, prefixes;
Trie_vertex *edges[SIGMA];
Trie_vertex() {
words = prefixes = 0;
memset(edges, 0, sizeof(Trie_vertex*) * SIGMA);
}
};
void addWord(Trie_vertex *vertex, const string& word, unsigned int pos) {
unsigned int indx;
for (unsigned int i = pos; i < word.size(); i++) {
indx = word[i] - 'a';
if (vertex->edges[indx] == nullptr)
vertex->edges[indx] = new Trie_vertex();
vertex = vertex->edges[indx];
vertex->prefixes++;
}
vertex->words++;
}
unsigned int countWords(Trie_vertex *vertex, const string& word, unsigned int pos) {
unsigned int indx;
for (unsigned int i = pos; i < word.size(); i++) {
indx = word[i] - 'a';
if (vertex->edges[indx] == nullptr)
return 0;
vertex = vertex->edges[indx];
}
return vertex->words;
}
unsigned int longestPrefix(Trie_vertex *vertex, const string& prefix, unsigned int pos) {
unsigned int nr = 0, indx;
for (unsigned int i = pos; i < prefix.size(); i++) {
indx = prefix[i] - 'a';
if (vertex->edges[indx] == nullptr)
return nr;
nr++;
vertex = vertex->edges[indx];
}
return nr;
}
void deleteWord(Trie_vertex *&vertex, const string& word, unsigned int pos) {
if (pos == word.size()) {
vertex->words--;
vertex->prefixes--;
if (vertex->words + vertex->prefixes == 0) {
delete vertex;
vertex = nullptr;
}
}
else {
deleteWord(vertex->edges[word[pos] - 'a'], word, pos + 1);
vertex->prefixes--;
if (vertex->words + vertex->prefixes == 0) {
delete vertex;
vertex = nullptr;
}
}
}
void eraseTrie(Trie_vertex *&vertex) {
for (unsigned int i = 0; i < SIGMA; i++)
if (vertex->edges[i] != nullptr)
eraseTrie(vertex->edges[i]);
delete vertex;
vertex = nullptr;
}
int main() {
Trie_vertex *head = new Trie_vertex();
ifstream in("trie.in");
ofstream out("trie.out");
string buffer;
while (getline(in, buffer)) {
switch (buffer[0]) {
case '0': addWord(head, buffer, 2); break;
case '1': deleteWord(head, buffer, 2); break;
case '2': out << countWords(head, buffer, 2) << "\n"; break;
case '3': out << longestPrefix(head, buffer, 2) << "\n"; break;
}
}
eraseTrie(head);
in.close();
out.close();
}