Pagini recente » Cod sursa (job #2427900) | Cod sursa (job #2443322) | Cod sursa (job #169368) | Cod sursa (job #2128950) | Cod sursa (job #1172727)
#include <fstream>
#include <cstring>
using namespace std;
ifstream fin ("trie.in");
ofstream fout ("trie.out");
char cuv[30];
int op,pref;
struct data {
int nrc;
int nrfii;
data *lit[30];
data() {
nrc=nrfii=0;
memset(lit,0,sizeof (lit));
}
}*trie = new data;
void update (data *p, char *s) {
if (*s==NULL) {
p->nrc++;
return;
}
if (p->lit[*s-'a']==0) {
p->lit[*s-'a']=new data;
p->nrfii++;
}
update (p->lit[*s-'a'],s+1);
}
bool del (data *p, char *s) {
if (*s==NULL)
p->nrc--;
else {
if (del(p->lit[*s-'a'],s+1)){
p->lit[*s-'a']=0;
p->nrfii--;
}
}
if (p->nrc==0 && p->nrfii==0) {
delete p;
return 1;
}
return 0;
}
int query (data *p, char *s) {
if (*s==NULL)
return p->nrc;
if (p->lit[*s-'a']!=NULL)
return query (p->lit[*s-'a'],s+1);
return 0;
}
void prefix (data *p, char *s) {
if(*s==0 || p->lit[*s-'a']==0)
return ;
pref++;
prefix(p->lit[*s-'a'],s+1);
}
int main () {
while (fin>>op) {
fin>>cuv;
if (op==0)
update(trie,cuv);
else
if (op==1)
del(trie,cuv);
else
if(op==2)
fout<<query(trie,cuv)<<"\n";
else {
pref=0;
prefix(trie,cuv);
fout<<pref<<"\n";
}
}
return 0;
}