Pagini recente » Cod sursa (job #802184) | Cod sursa (job #2790713) | Cod sursa (job #1268238) | Cod sursa (job #1145781) | Cod sursa (job #2034597)
#include <iostream>
#include <fstream>
#include <string>
#define SIGMA 26
using namespace std;
struct Trie_vertex {
unsigned int words, prefixes;
Trie_vertex *edges[SIGMA];
Trie_vertex() {
words = prefixes = 0;
for (unsigned int i = 0; i < SIGMA; i++)
edges[i] = nullptr;
}
};
void addWord(Trie_vertex *vertex, const string& word, string::iterator& it) {
for (; it != word.end(); ++it) {
if (vertex->edges[*it - 'a'] == nullptr)
vertex->edges[*it - 'a'] = new Trie_vertex();
vertex = vertex->edges[*it - 'a'];
vertex->prefixes++;
}
vertex->words++;
}
unsigned int countWords(Trie_vertex *vertex, const string& word, string::iterator& it) {
for (; it != word.end(); ++it) {
if (vertex->edges[*it - 'a'] == nullptr)
return 0;
vertex = vertex->edges[*it - 'a'];
}
return vertex->words;
}
unsigned int longestPrefix(Trie_vertex *vertex, const string& prefix, string::iterator& it) {
unsigned int nr = 0;
for (; it != prefix.end(); ++it) {
if (vertex->edges[*it - 'a'] == nullptr)
return nr;
nr++;
vertex = vertex->edges[*it - 'a'];
}
return nr;
}
void deleteWord(Trie_vertex *&vertex, const string& word, string::iterator& it) {
if (it == word.end()) {
vertex->words--;
vertex->prefixes--;
if (vertex->words + vertex->prefixes == 0) {
delete vertex;
vertex = nullptr;
}
} else {
deleteWord(vertex->edges[*it - 'a'], word, it + 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, buffer.begin() + 2); break;
case '1': deleteWord(head, buffer, buffer.begin() + 2); break;
case '2': out << countWords(head, buffer, buffer.begin() + 2) << "\n"; break;
case '3': out << longestPrefix(head, buffer, buffer.begin() + 2) << "\n"; break;
}
}
eraseTrie(head);
in.close();
out.close();
}