Pagini recente » Cod sursa (job #2146437) | Atasamentele paginii Profil Calinus | Cod sursa (job #1478888) | Monitorul de evaluare | Cod sursa (job #1356340)
#include <bits/stdc++.h>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
#define cout g
#define DA 26
struct nod
{
int nr,nr_fii;
nod *fii[DA];
nod()
{
nr=nr_fii=0;
for(int i=0; i<DA; ++i) fii[i]=0;
}
};
nod *root,*p;
int tip;
char s[DA];
void add(char *c,nod *p)
{
if(*c=='\0')
{
++(p->nr);
return;
}
int x=*c-'a';
if((p->fii[x])==0)
{
(p->fii[x])=new nod;
++p->nr_fii;
}
add(c+1,p->fii[x]);
}
bool del(char *c,nod *p)
{
int x=*c-'a';
if(*c=='\0') --(p->nr);
else if(del(c+1,p->fii[x]))
{
--(p->nr_fii);
p->fii[x]=0;
}
if((p->nr)==0 && (p->nr_fii)==0 && p!=root)
{
delete p;
return 1;
}
return 0;
}
void find(char *c,nod*p)
{
if(*c=='\0')
{
cout<<p->nr<<'\n';
return;
}
int x=*c-'a';
if(p->fii[x]==0)
{
cout<<"0\n";
return;
}
find(c+1,p->fii[x]);
}
void pref(char *c,nod*p,int l)
{
if(*c=='\0')
{
cout<<l<<'\n';
return;
}
int x=*c-'a';
if(p->fii[x]==0)
{
cout<<l<<'\n';
return;
}
pref(c+1,p->fii[x],l+1);
}
int main()
{
root=new nod;
while(f>>tip)
{
f>>s;
switch(tip)
{
case 0:
add(s,root);
break;
case 1:
del(s,root);
break;
case 2:
find(s,root);
break;
case 3:
pref(s,root,0);
break;
}
}
return 0;
}