Pagini recente » Istoria paginii runda/pregatire2020 | Cod sursa (job #3041925) | Cod sursa (job #408344) | Cod sursa (job #998418) | Cod sursa (job #2006317)
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
ifstream in("trie.in");
ofstream out("trie.out");
struct Node {
int words;
int prefixes;
Node* children[26];
Node() {
words = 0;
prefixes = 0;
for (int i = 0; i < 26; ++i) children[i] = nullptr;
}
};
Node* root;
void addWord(Node* v, string& w) {
int c = w[0] - 'a';
if (v -> children[c] == nullptr) v -> children[c] = new Node();
v -> children[c] -> prefixes++;
w.erase(w.begin());
if (w.size() == 0) {
v -> children[c] -> words++;
} else {
addWord(v -> children[c], w);
}
}
int countWords(Node* v, string& w) {
if (w.size() == 0) return v -> words;
int c = w[0] - 'a';
if (v -> children[c] == nullptr) return 0;
w.erase(w.begin());
return countWords(v -> children[c], w);
}
void deleteWord(Node* v, string& w) {
if (w.size() == 0) {
v -> words--;
v -> prefixes--;
} else {
int c = w[0] - 'a';
v -> prefixes--;
w.erase(w.begin());
deleteWord(v -> children[c], w);
}
if (v -> prefixes == 0 && v != root) {
v = nullptr;
delete v;
}
}
int longestPrefix(Node* v, string &w, int k) {
while (w.size() >= 0 && v != nullptr) {
if (v -> prefixes > 0) k++;
int c = w[0] - 'a';
v = v -> children[c];
if (w.size() > 0) w.erase(w.begin()); else break;
}
return k;
}
int main()
{
root = new Node();
int o;
string w;
while (in >> o) {
in >> w;
switch(o) {
case 0: addWord(root, w); break;
case 1: deleteWord(root, w); break;
case 2: out << countWords(root, w) << '\n'; break;
case 3: out << longestPrefix(root, w, 0) << '\n'; break;
}
}
return 0;
}