Pagini recente » Cod sursa (job #1001375) | Cod sursa (job #2957518) | Cod sursa (job #528434) | Cod sursa (job #2282438) | Cod sursa (job #1109861)
#include <iostream>
#include <fstream>
#include <string>
#include <algorithm>
#include <cstring>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct Trie {
int fn, sz;
Trie *sir[26];
Trie () {
sz = 0; fn = 0;
memset(sir, 0, sizeof sir);
}
};
Trie *trie = new Trie;
string s;
void adauga(int poz, Trie *cur) {
if (poz == s.size()) {
++cur->fn;
return;
}
int a = s[poz] - 'a';
if (cur->sir[a] == 0) {
++cur->sz;
cur->sir[a] = new Trie;
}
adauga(poz + 1, cur->sir[a]);
}
bool sterge(int poz, Trie *cur) {
if (poz == s.size()) {
--cur->fn;
}
else {
int a = s[poz] - 'a';
if (sterge(poz + 1, cur->sir[a])) {
--cur->sz;
cur->sir[a] = 0;
}
}
if (cur->sz == 0 && cur->fn == 0) {
delete cur;
return 1;
}
return 0;
}
int get_aparitii(int poz, Trie *cur) {
if (poz == s.size()) {
return cur->fn;
}
int a = s[poz] - 'a';
if (cur->sir[a] == 0) return 0;
else return get_aparitii(poz + 1, cur->sir[a]);
}
int get_prefix(int poz, Trie *cur) {
if (poz == s.size())
return 0;
int a = s[poz] - 'a';
if (cur->sir[a] == 0) return 0;
else return 1 + get_prefix(poz + 1, cur->sir[a]);
}
int main() {
int type = 0;
while (fin >> type) {
fin >> s;
if (type == 0)
adauga(0, trie);
else if (type == 1)
sterge(0, trie);
else if (type == 2)
fout << get_aparitii(0, trie) << "\n";
else
fout << get_prefix(0, trie) << "\n";
}
return 0;
}