Pagini recente » Cod sursa (job #2953440) | Cod sursa (job #2241284) | Cod sursa (job #2301547) | Cod sursa (job #298932) | Cod sursa (job #2416769)
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
struct trie{
int ap, nrfii;
trie *fii[26];
trie(){
ap = nrfii = 0;
for(int i = 0; i < 26; ++i)
fii[i] = NULL;
}
}*r;
char a[50];
int c;
void adauga(trie *& nod, char* l){
if(*l=='\n'){
nod->ap++;
return ;
}
if(nod->fii[*l-'a']==NULL){
nod->fii[*l-'a'] = new trie();
nod->nrfii++;
}
adauga(nod->fii[*l-'a'],l+1);
}
int apariti(trie *& nod, char *l){
if(*l=='\n'){
return nod->ap;
}
if(nod->fii[*l-'a']==NULL){
return 0;
}
return apariti(nod->fii[*l-'a'],l+1);
}
int prefix(trie *& nod, char *l){
if(nod == NULL)
return l-a-1;
if(*l == '\n')
return strlen(a)-1;
return prefix(nod->fii[*l-'a'], l+1);
}
bool sterge(trie *& nod, char *l){
if(*l=='\n')
nod->ap--;
else{
if(sterge(nod->fii[*l-'a'],l+1)){
nod->fii[*l-'a'] = NULL;
nod->nrfii--;
}
}
if(nod->ap == 0 && nod->nrfii == 0 && nod!=r){
delete nod;
return 1;
}
return 0;
}
int main()
{
freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
r = new trie();
while(scanf("%d ", &c)==1){
fgets(a,50,stdin);
if(c==0)
adauga(r,a);
else if(c==1)
sterge(r,a);
else if(c==2)
cout<<apariti(r,a)<<"\n";
else if(c==3)
cout<<prefix(r,a)<<"\n";
}
return 0;
}