Pagini recente » Cod sursa (job #2413088) | Cod sursa (job #2442348) | Cod sursa (job #1480777) | Cod sursa (job #1131148) | Cod sursa (job #2339788)
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
ifstream in("trie.in");
ofstream out("trie.out");
struct node {
int nr_cuv;
char nr_fii;
node* fiu[26];
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;
}
if(T -> fiu[*s - 'a'] == 0){
T -> fiu[*s - 'a'] = new node;
T -> nr_fii++;
}
add(T -> fiu[*s - 'a'], s + 1);
}
int freq(node* T, char* s){
if(*s==0)return T -> nr_cuv;
if(T -> fiu[*s - 'a'] == 0)return 0;
return freq(T -> fiu[*s - 'a'], 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;
}
if(del(T -> fiu[*s - 'a'], s+1) == 1){
T -> nr_fii--;
T -> fiu[*s - 'a'] = 0;
if(T -> nr_cuv == 0 && T -> nr_fii == 0 && T != root){
delete T;
return 1;
}
}
return 0;
///nu am idee inca ce tb sa fac
}
int pref(node* T, char* s){
if(*s == 0)return 0;
if(T -> fiu[*s - 'a'] == 0)return 0;
return 1 + pref(T -> fiu[*s - 'a'], 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;
}