Pagini recente » Cod sursa (job #2124298) | Cod sursa (job #320387) | Cod sursa (job #2318479) | Cod sursa (job #1873099) | Cod sursa (job #2266673)
#include <bits/stdc++.h>
using namespace std;
struct trie{
int nr, nrf;
trie *fiu[26];
trie(){
nr = nrf = 0;
memset(fiu, 0, sizeof(fiu));
}
};
trie *T = new trie;
char *capat;
void ins(trie *nod, char *it){
if(it != capat){
if(nod->fiu[*it] == 0){
nod->nrf++;
nod->fiu[*it] = new trie;
}
ins(nod->fiu[*it], it + 1);
}
else
nod->nr++;
}
int flag;
void del(trie *nod, char *it){//0 - inca taiem. 1 - nu mai taiem
if(it == capat){
nod->nr--;
if(nod->nr == 0 && nod->nrf == 0)
flag = 0;
else
flag = 1;
return;
}
del(nod->fiu[*it], it + 1);
if(flag == 0){
delete nod->fiu[*it];
nod->nrf--;
nod->fiu[*it] = 0;
if(!(nod->nr == 0 && nod->nrf == 0))
flag = 1;
}
}
int get_occ(trie *nod, char *it){
if(it != capat){
if(nod->fiu[*it] == 0)
return 0;
return get_occ(nod->fiu[*it], it + 1);
}
return nod->nr;
}
int get_pref(trie *nod, char *it, int niv){
if(it != capat){
if(nod->fiu[*it] == 0)
return niv;
return get_pref(nod->fiu[*it], it + 1, niv + 1);
}
return niv;
}
char s[21];
int main()
{
FILE *fi = fopen("trie.in", "r"), *fo = fopen("trie.out", "w");
int op;
while(fscanf(fi, "%d%s", &op, s) != EOF){
capat = s + strlen(s);
for(char *i = s; i != capat; i++)
*i -= 'a';
if(op == 0)
ins(T, s);
else if(op == 1)
del(T, s);
else if(op == 2)
fprintf(fo, "%d\n", get_occ(T, s));
else
fprintf(fo, "%d\n", get_pref(T, s, 0));
}
fclose(fi);
fclose(fo);
return 0;
}