Pagini recente » Cod sursa (job #3121587) | Cod sursa (job #2851878) | Cod sursa (job #1208058) | Cod sursa (job #662936) | Cod sursa (job #714170)
Cod sursa(job #714170)
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<string>
#include<vector>
using namespace std;
struct nod_trie{
int nr_ap;
int nr_el_sub;
int vec[26];
int tata;
char lit_tata;
bool sters;
nod_trie(){
nr_ap = 0;
nr_el_sub = 0;
tata = 0;
lit_tata = 0;
sters = false;
memset(vec, 0, sizeof(vec));
}
};
vector <nod_trie> noduri;
vector <int> de_sters;
void add(const char cuv[22]) {
int len_cuv = strlen(cuv);
int start = 1;
for( int i = 0; i < len_cuv; ++i) {
if( noduri[start].vec[cuv[i]-'a'] == 0) {
nod_trie a;
int element;
if( de_sters.size() != 0 ) {
element = de_sters.back();
de_sters.pop_back();
noduri[element] = a;
}
else {
noduri.push_back(a);
element = noduri.size() - 1;
}
noduri[start].vec[cuv[i]-'a'] = element;
noduri[element].tata = start;
noduri[element].lit_tata = cuv[i];
}
noduri[start].nr_el_sub++;
start = noduri[start].vec[cuv[i]-'a'];
}
noduri[start].nr_ap++;
}
void sterge( int nr_nod) {
if( nr_nod == 1) return ;
de_sters.push_back(nr_nod);
noduri[nr_nod].sters = true;
int tatal = noduri[nr_nod].tata;
noduri[tatal].vec[noduri[nr_nod].lit_tata-'a'] = 0;
}
void remove2(const char cuv[22]) {
int len_cuv = strlen(cuv);
int start = 1;
for( int i = 0; i < len_cuv; ++i) {
noduri[start].nr_el_sub--;
if( noduri[start].nr_el_sub == 0 && noduri[start].nr_ap == 0)
sterge(start);
start = noduri[start].vec[cuv[i]-'a'];
}
noduri[start].nr_ap--;
if( noduri[start].nr_el_sub == 0 && noduri[start].nr_ap == 0)
sterge(start);
}
int nr_op(const char cuv[22]) {
int len_cuv = strlen(cuv);
int start = 1;
for( int i = 0; i < len_cuv; ++i) {
if( noduri[start].vec[cuv[i]-'a'] == 0)
return 0;
start = noduri[start].vec[cuv[i]-'a'];
}
return noduri[start].nr_ap;
}
int prefix(const char cuv[22]) {
int len_cuv = strlen(cuv);
int start = 1;
for( int i = 0; i < len_cuv; ++i) {
if( noduri[start].vec[cuv[i]-'a'] == 0)
return i;
start = noduri[start].vec[cuv[i]-'a'];
if( noduri[start].sters == true)
return i;
}
if( noduri[start].sters == true)
return len_cuv - 1;
return len_cuv;
}
int main() {
freopen ("trie.in", "r", stdin);
freopen ("trie.out", "w", stdout);
int tip_op;
char cuv[22];
nod_trie a;
noduri.push_back(a);
noduri.push_back(a);
while( scanf("%d %s", &tip_op, &cuv) == 2) {
if( tip_op == 0) {
add(cuv);
}
if( tip_op == 1) {
remove2(cuv);
}
if( tip_op == 2) {
printf("%d\n", nr_op(cuv));
}
if( tip_op == 3) {
printf("%d\n", prefix(cuv));
}
}
return 0;
}