Pagini recente » Cod sursa (job #1326326) | Cod sursa (job #1244694) | Cod sursa (job #2387195) | Cod sursa (job #3153233) | Cod sursa (job #717528)
Cod sursa(job #717528)
#include <cstring>
#include <stdio.h>
using namespace std;
struct nod{
nod *v[26];
int fii;
int nr;
nod(){
fii=nr=0;
memset(v,0,sizeof(v) );
}
};
nod *T=new nod;
void adaug(nod *t,char s[21],int i){
if(i==strlen(s)){
t->nr++;
return;
}
if(t->v[s[i]-'a']==0){
t->v[s[i]-'a']=new nod;
t->fii++;
}
adaug(t->v[s[i]-'a'],s,i+1);
}
int del(nod *t,char s[21],int i){
if (i==strlen(s))
t->nr--;
else
if (del(t->v[s[i]-'a'],s,i+1)){
t->v[s[i]-'a']=0;
t->fii--;
}
if (!t->nr && !t->fii==0 && t!=T){
delete t; return 1;
}
return 0;
}
int query(nod *t, char s[21],int i){
if (i==strlen(s))
return t->nr;
if (t->v[s[i]-'a'])
return query(t->v[s[i]-'a'],s,i+1);
return 0;
}
int prefix(nod *t,char s[21],int i){
if (i==strlen(s) || !t->v[s[i]-'a'])
return i;
return prefix(t->v[s[i]-'a'],s,i+1);
}
int main ()
{
freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
int op;
char c[21];
while( scanf("%d %s", &op, c) != EOF){
if (op==0) adaug(T,c,0);
else if (op==1) del(T,c,0);
else if (op==2) printf("%d\n",query(T,c,0));
else if (op==3) printf("%d\n",prefix(T,c,0));
}
return 0;
}