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