Pagini recente » Cod sursa (job #113037) | Cod sursa (job #286041) | Cod sursa (job #276508) | Cod sursa (job #113034) | Cod sursa (job #303965)
Cod sursa(job #303965)
#include<stdio.h>
#include <string.h>
struct Trie
{
int cnt,nrfii;
Trie *fiu[27];
Trie() { cnt=nrfii=0; memset(fiu,0,sizeof(fiu));}
};
Trie *T=new Trie;
void inserare(Trie *nod, char *s)
{
if (s[0]=='\n') { nod->cnt++; return;}
if (nod->fiu[s[0]-'a']==NULL)
{
nod->fiu[s[0]-'a']= new Trie;
nod->nrfii++;
}
inserare(nod->fiu[s[0]-'a'],s+1);
}
int stergere(Trie *nod, char *s)
{
if (s[0]=='\n') nod->cnt--;
else {
if (stergere(nod->fiu[s[0]-'a'],s+1))
{
nod->nrfii--;
nod->fiu[s[0]-'a']=0;
}
}
if (nod->cnt==0 && nod->nrfii==0 && nod!=T) { delete nod; return 1;}
return 0;
}
int nrap(Trie *nod, char *s)
{
if (s[0]=='\n') return nod->cnt;
if (nod->fiu[s[0]-'a']) return nrap(nod->fiu[s[0]-'a'],s+1);
else return 0;
}
int prefix(Trie *nod, char *s, int k)
{
if (s[0]=='\n' || nod->fiu[s[0]-'a']==0) return k;
return prefix(nod->fiu[s[0]-'a'],s+1,k+1);
}
int main()
{
FILE *fin=fopen("trie.in","r");
FILE *fout=fopen("trie.out","w");
char sir[32];
while (fgets(sir,32,fin))
{
switch (sir[0])
{
case '0': { inserare(T,sir+2); break;}
case '1': { stergere(T,sir+2); break;}
case '2': { fprintf(fout,"%d\n",nrap(T,sir+2)); break;}
case '3': { fprintf(fout,"%d\n",prefix(T,sir+2,0)); break;}
}
}
fcloseall();
return 0;
}