Pagini recente » Cod sursa (job #625429) | Cod sursa (job #322603) | Cod sursa (job #2730274) | Cod sursa (job #313778) | Cod sursa (job #780621)
Cod sursa(job #780621)
#include <cstdio>
#include <cstring>
#define nmax 26
FILE *f = fopen("trie.in","r");
FILE *g = fopen("trie.out","w");
class nod
{
private:
int nrfii,aparitii;
nod* fiu[nmax];
public:
nod()
{
aparitii=nrfii=0;
memset(fiu,0,sizeof(fiu));
}
void insert(char*);
int del(char*);
int print(char*);
int prefix(char*,int);
void solve();
};
nod *r = new nod;
void nod::insert(char* cuv)
{
if(*cuv == '\n')
{
aparitii++;
return;
}
if(fiu[*cuv-'a'] == 0)
{
fiu[*cuv-'a'] = new nod;
nrfii++;
}
fiu[*cuv-'a']->insert(cuv+1);
}
int nod::del(char* cuv)
{
if(*cuv=='\n')
{
aparitii--;
}
else if(fiu[*cuv-'a']->del(cuv+1) !=0)
{
fiu[*cuv-'a'] = NULL;
nrfii--;
}
if(aparitii == 0 && nrfii == 0 && this!=r)
{
delete this;
return 1;
}
return 0;
}
int nod::print(char *cuv)
{
if(*cuv == '\n')
return aparitii;
if(fiu[*cuv-'a'] != NULL)
return fiu[*cuv-'a']->print(cuv+1);
return 0;
}
int nod::prefix(char* cuv,int k)
{
if(*cuv == '\n' || fiu[*cuv-'a'] == 0)
return k;
return fiu[*cuv-'a']->prefix(cuv+1,k+1);
}
void nod::solve()
{
while(!feof(f))
{
char cuv[50];
fgets(cuv,50,f);
if(cuv[0] == '0')
{
insert(cuv+2);
}
else if(cuv[0]=='1')
{
del(cuv+2);
}
else if(cuv[0]=='2')
{
fprintf(g,"%d\n",print(cuv+2));
}
else
{
fprintf(g,"%d\n",prefix(cuv+2,0));
}
}
}
int main()
{
r->solve();
fclose(f);
fclose(g);
return 0;
}