Pagini recente » Cod sursa (job #2868738) | Cod sursa (job #3202809) | Cod sursa (job #930922) | Cod sursa (job #2931284) | Cod sursa (job #1955447)
#include <fstream>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
struct nod
{
int nr,nrfii;
nod *next[26];
}*rad;
int t;
char s[21];
void adauga(char *s, nod *r)
{
if(!*s)
{
r->nr++;
return;
}
if(r->next[*s-'a']==0)
{
r->next[*s-'a']=new nod;
r->next[*s-'a']->nrfii=0;
r->next[*s-'a']->nr=0;
for(int i=0; i<26; i++) r->next[*s-'a']->next[i]=0;
r->nrfii++;
}
adauga(s+1,r->next[*s-'a']);
}
int sterge(char *s, nod *r)
{
if(!*s) r->nr--;
else if(sterge(s+1,r->next[*s-'a']))
{
r->nrfii--;
r->next[*s-'a']=0;
}
if(r->nr==0 && r->nrfii==0 && r!=rad)
{
delete r;
return 1;
}
return 0;
}
int aparitii(char *s, nod *r)
{
if(!r) return 0;
if(!*s) return r->nr;
return aparitii(s+1,r->next[*s-'a']);
}
int prefix(char *s, nod *r,int nr)
{
if(!*s || r->next[*s-'a']==0) return nr;
return prefix(s+1,r->next[*s-'a'],nr+1);
}
int main()
{
rad=new nod;
rad->nrfii=0;
rad->nr=0;
for(int i=0; i<26; i++) rad->next[i]=0;
while(f>>t)
{
f>>s;
if(!t) adauga(s,rad);
else if(t==1) sterge(s,rad);
else if(t==2) g<<aparitii(s,rad)<<'\n';
else g<<prefix(s,rad,0)<<'\n';
}
return 0;
}
/*
*/