Pagini recente » Cod sursa (job #4941) | Cod sursa (job #1663281) | Cod sursa (job #1391056) | Cod sursa (job #1273284) | Cod sursa (job #2034595)
#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;
}
} *head;
void addWord(Trie_vertex *vertex, const string& word) {
for (unsigned int i = 0; i < word.size(); i++) {
if (vertex->edges[word[i] - 'a'] == nullptr)
vertex->edges[word[i] - 'a'] = new Trie_vertex();
vertex = vertex->edges[word[i] - 'a'];
vertex->prefixes++;
}
vertex->words++;
}
unsigned int countWords(Trie_vertex *vertex, const string& word) {
for (unsigned int i = 0; i < word.size(); i++) {
if (vertex->edges[word[i] - 'a'] == nullptr)
return 0;
vertex = vertex->edges[word[i] - 'a'];
}
return vertex->words;
}
unsigned int longestPrefix(Trie_vertex *vertex, const string& prefix) {
unsigned int nr = 0;
for (unsigned int i = 0; i < prefix.size(); i++) {
if (vertex->edges[prefix[i] - 'a'] == nullptr)
return nr;
nr++;
vertex = vertex->edges[prefix[i] - 'a'];
}
return nr;
}
void deleteWord(Trie_vertex *&vertex, const string& word) {
if (word.empty()) {
vertex->words--;
vertex->prefixes--;
if (vertex->words + vertex->prefixes == 0) {
delete vertex;
vertex = nullptr;
}
} else {
deleteWord(vertex->edges[word[0] - 'a'], move(word.substr(1)));
vertex->prefixes--;
if (vertex->words + vertex->prefixes == 0) {
delete vertex;
vertex = nullptr;
}
}
}
int main() {
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, move(buffer.substr(2))); break;
case '1': deleteWord(head, move(buffer.substr(2))); break;
case '2': out << countWords(head, move(buffer.substr(2))) << "\n"; break;
case '3': out << longestPrefix(head, move(buffer.substr(2))) << "\n"; break;
}
}
in.close();
out.close();
}