Pagini recente » Cod sursa (job #1822290) | Cod sursa (job #2484689) | Cod sursa (job #913562) | Cod sursa (job #2408732) | Cod sursa (job #2339779)
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
ifstream in("trie.in");
ofstream out("trie.out");
struct node {
int nr_cuv;
int nr_fii;
node* fiu[30];
node(){
nr_cuv = 0;
nr_fii = 0;
memset(fiu, 0, sizeof(fiu));
}
};
node* root;
char cuv[50];
int q,op;
void add(node* T, char* s){
if(*s == 0){
T -> nr_cuv++;
return;
}
int delta = *s-'a';
if(T -> fiu[delta] == 0){
T -> fiu[delta] = new node;
T -> nr_fii++;
}
add(T -> fiu[delta], s + 1);
}
int freq(node* T, char* s){
if(*s==0)return T -> nr_cuv;
int delta = *s - 'a';
if(T -> fiu[delta] == 0)return 0;
return freq(T -> fiu[delta], s + 1);
}
int del(node* T, char* s){
if(*s == 0){
T -> nr_cuv--;
if(T -> nr_cuv == 0 && T -> nr_fii == 0 && T != root){
delete T;
return 1;
}
return 0;
}
int delta = *s - 'a';
if(del(T -> fiu[delta], s+1)){
T -> nr_fii--;
T -> fiu[delta] = 0;
if(T -> nr_cuv == 0 && T -> nr_fii == 0 && T != root){
delete T;
return 1;
}
}
///nu am idee inca ce tb sa fac
}
int pref(node* T, char* s){
if(*s == 0)return 0;
int delta = *s - 'a';
if(T -> fiu[delta] == 0)return 0;
return 1 + pref(T -> fiu[delta], s + 1);
}
int main()
{
root = new node;
while(in >> op){
in >> cuv;
if(op == 0)add(root, cuv);
if(op == 1)del(root, cuv);
if(op == 2)out << freq(root, cuv) << '\n';
if(op == 3)out << pref(root, cuv) << '\n';
}
return 0;
}