Pagini recente » Cod sursa (job #2239116) | Borderou de evaluare (job #1145909) | Borderou de evaluare (job #906647) | Borderou de evaluare (job #1021906) | Cod sursa (job #2508778)
#include <bits/stdc++.h>
using namespace std;
ifstream fin ("trie.in");
ofstream fout ("trie.out");
struct trie{
int fii = 0;
int cnt = 0;
trie *f[30];
trie () {
for (int i=0; i<26; i++){
f[i] = 0;
}
}
};
trie *rad;
int op;
char s[30];
void insereaza (trie *nod, char *s){
if (*s != 0){
if (nod->f[*s-'a'] == 0){
nod->f[*s-'a'] = new trie;
nod->fii++;
}
insereaza (nod->f[*s-'a'], s+1);
}
else{
nod->cnt++;
}
}
int sterge (trie *&nod, char *s){
if (*s == 0){
nod->cnt--;
if (nod->cnt == 0 && nod->fii == 0 && nod != rad){
delete nod;
nod = NULL;
return 1;
}
}
else{
if (sterge (nod->f[*s-'a'], s + 1)){
nod->fii--;
if (nod->cnt == 0 && nod->fii == 0 && nod != rad){
delete nod;
nod = NULL;
return 1;
}
}
}
return 0;
}
int aparitii (trie *nod, char *s){
if (*s == 0){
return nod->cnt;
}
if (nod->f[*s-'a'] == NULL){
return 0;
}
else{
return aparitii(nod->f[*s-'a'], s + 1);
}
}
int prefix (trie *nod, char *s){
if (*s == 0){
return nod->cnt;
}
if (nod->f[*s-'a'] == NULL){
return 0;
}
else{
return 1 + prefix(nod->f[*s-'a'], s + 1);
}
}
int main(){
rad = new trie;
while (fin >> op >> s){
if (op == 0){
insereaza (rad, s);
}
if (op == 1){
sterge (rad, s);
}
if (op == 2){
fout << aparitii (rad, s) << "\n";
}
if (op == 3){
fout << prefix (rad, s) << "\n";
}
}
return 0;
}