Pagini recente » Cod sursa (job #2542972) | Cod sursa (job #1950596) | Cod sursa (job #1478383) | Cod sursa (job #569328) | Cod sursa (job #2602640)
#include <bits/stdc++.h>
using namespace std;
ifstream in("trie.in");
ofstream out("trie.out");
int tip;
char c[21];
#define val (*c-'a')
struct trie{
int nrFii,cnt;
trie *fiu[26];
trie(){
cnt=nrFii=0;
memset(fiu,0,sizeof(fiu));
}
};
trie *t=new trie;
void ins(trie *nod,char *c){
if(*c==0){
nod->cnt++;
return;
}
if(nod->fiu[val]==0){
nod->fiu[val]=new trie;
nod->nrFii++;
}
ins(nod->fiu[val],c+1);
}
int del(trie *nod,char *c){
if(*c==0)
nod->cnt--;
else if(del(nod->fiu[val],c+1)){
nod->fiu[val]=0;
nod->nrFii--;
}
if(nod->cnt==0 && nod->nrFii==0 && nod!=t){
delete nod;
return 1;
}
return 0;
}
int ans1(trie *nod,char *c){
if(*c==0)
return nod->cnt;
if(nod->fiu[val])
return ans1(nod->fiu[val],c+1);
return 0;
}
int ans2(trie *nod,char *c,int k){
if(*c==0 || nod->fiu[val]==0)
return k;
return ans2(nod->fiu[val],c+1,k+1);
}
int main()
{
while(in>>tip>>c)
switch(tip){
case 0:ins(t,c);break;
case 1:del(t,c);break;
case 2:out<<ans1(t,c)<<'\n';break;
case 3:out<<ans2(t,c,0)<<'\n';break;
}
return 0;
}