Pagini recente » Cod sursa (job #1578445) | Cod sursa (job #514980) | Cod sursa (job #408971) | Cod sursa (job #713442) | Cod sursa (job #2006296)
#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) {
if (w.size() == 0) {
v -> words++;
v -> prefixes++;
} else {
int c = w[0] - 'a';
if (v -> children[c] == nullptr) v -> children[c] = new Node();
v -> prefixes++;
w.erase(w.begin(), w.begin() + 1);
addWord(v -> children[c], w);
}
}
int countWords(Node* v, string& w) {
if (w.size() == 0) return v -> words;
int c = w[0] - 'a';
w.erase(w.begin(), w.begin() + 1);
return countWords(v -> children[c], w);
}
void deleteWord(Node* v, string &w) {
if (w.size() == 0) {
v -> words--;
v -> prefixes--;
if (v -> prefixes == 0 && v != root) {
v = nullptr;
delete v;
}
} else {
int c = w[0] - 'a';
v -> prefixes--;
w.erase(w.begin(), w.begin() + 1);
deleteWord(v -> children[c], w);
if (v -> prefixes == 0 && v != root) {
v = nullptr;
delete v;
}
}
}
int longestPrefix(Node* v, string &w, int k) {
int c = w[0] - 'a';
if (v -> prefixes > 1) {
w.erase(w.begin(), w.begin() + 1);
return longestPrefix(v -> children[c], w, k + 1);
}
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;
}