Pagini recente » Cod sursa (job #354727) | Cod sursa (job #2177724) | Cod sursa (job #1081809) | Cod sursa (job #3176035) | Cod sursa (job #800771)
Cod sursa(job #800771)
#include<stdio.h>
#include<string.h>
struct Trie {
int nr_aparitii, nr_fii;
Trie *fiu[26];
Trie() {
nr_aparitii = nr_fii = 0;
memset(fiu,0,sizeof(fiu));
}
};
Trie *T = new Trie;
#define ind (*sir - 'a')
void add(Trie *nod, char *sir) {
if(*sir=='\n' || *sir==NULL) {
nod->nr_aparitii++;
return;
}
if(nod->fiu[ind]==NULL) {
nod->fiu[ind] = new Trie;
nod->nr_fii++;
}
add(nod->fiu[ind], sir+1);
}
int del(Trie *nod, char *sir) {
if(*sir=='\n' || *sir==NULL)
nod->nr_aparitii--;
else
if(del(nod->fiu[ind],sir+1)) {
nod->fiu[ind] = NULL;
nod->nr_fii--;
}
if(nod->nr_aparitii==0 && nod->nr_fii==0 && nod!=T) {
delete nod;
return 1;
}
return 0;
}
int query(Trie *nod, char *sir) {
if(*sir=='\n' || *sir==NULL)
return nod->nr_aparitii;
if(nod->fiu[ind]!=NULL)
return query(nod->fiu[ind], sir+1);
return 0;
}
int prefix(Trie *nod, char *sir, int val) {
if((*sir=='\n' || *sir==NULL) || nod->fiu[ind]==NULL)
return val;
return prefix(nod->fiu[ind], sir+1, val+1);
}
int main() {
freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
char sir[23];
while(!feof(stdin)) {
gets(sir);
switch(sir[0]) {
case '0':
add(T, sir+2);
break;
case '1':
del(T, sir+2);
break;
case '2':
printf("%d\n",query(T, sir+2));
break;
case '3':
printf("%d\n",prefix(T, sir+2, 0));
break;
}
}
return 0;
}