Pagini recente » Cod sursa (job #786609) | Cod sursa (job #2763256) | Cod sursa (job #2083093) | Cod sursa (job #706191) | Cod sursa (job #2081406)
#include <cstdio>
using namespace std;
char s[22];
struct trie {
int fii,nr;
trie *v[26];
trie (){
fii=nr=0;
for (int i=0;i<26;i++)
v[i]=0;
}
};
trie *r=new trie;
trie *root=r;
void update (trie *&r,int i) {
if (s[i]!=0){
if (r->v[s[i]-'a']==NULL){
r->fii++;
r->v[s[i]-'a']=new trie;
}
update (r->v[s[i]-'a'],i+1);
}
else r->nr++;
}
int sterge (trie *&r,int i){
if (i==2)
printf ("a");
if (s[i]==0){
r->nr--;
if (r->nr==0){ /// trb sa sterg ramura aia
if (r->fii==0 && r!=root){
delete r;
r=0;
return 1;
}
}
}
else {
if (sterge (r->v[s[i]-'a'],i+1)){
r->fii--;
if (r->fii==0 && r->nr==0 && r!=root){
delete r;
r=0;
return 1;
}
}
}
return 0;
}
int frecv (trie *r,int i){
if (r==NULL)
return 0;
if (s[i]==0)
return r->nr;
else
return frecv (r->v[s[i]-'a'],i+1);
}
int prcm (trie *r,int i){
if (i==1)
printf ("a");
if (s[i]==0)
return 0;
if (r->v[s[i]-'a']==NULL)
return 0;
else return 1+prcm (r->v[s[i]-'a'],i+1);
}
int main()
{
FILE *fin=fopen ("trie.in","r");
FILE *fout=fopen ("trie.out","w");
int
c=fgetc (fin);
while (c>='0' && c<='3'){
fgetc (fin);
fscanf (fin,"%s",s);
fgetc (fin);
if (c=='0')
update (root,0);
else if (c=='1')
sterge (root,0);
else if (c=='2')
fprintf (fout,"%d\n",frecv (root,0));
else if (c=='3')
fprintf (fout,"%d\n",prcm (root,0));
c=fgetc (fin);
}
return 0;
}