Pagini recente » Cod sursa (job #2657473) | Cod sursa (job #1978217) | Cod sursa (job #2636396) | Cod sursa (job #1866291) | Cod sursa (job #330502)
Cod sursa(job #330502)
#include <cstdio>
#include <cstring>
#define file_in "trie.in"
#define file_out "trie.out"
struct trie
{
int nrc,cnt;
trie *a[26];
trie()
{
memset(a,0,sizeof(a));
nrc=cnt=0;
}
}*rad=new trie;
int tip;
char s[32];
void insert_trie(trie *nod, char s[])
{
if (s[0]=='\n')
{
nod->cnt++;
return ;
}
if (nod->a[s[0]-'a']==0)
{
nod->nrc++;
nod->a[s[0]-'a'] = new trie;
}
insert_trie(nod->a[s[0]-'a'],s+1);
}
int delete_trie(trie *nod, char s[])
{
if (s[0]=='\n')
{
nod->cnt--;
}
else
if (delete_trie(nod->a[s[0]-'a'],s+1))
{
nod->nrc--;
nod->a[s[0]-'a']=0;
}
if (!nod->nrc && !nod->cnt && nod!=rad)
{
delete(nod);
return 1;
}
return 0;
}
int cauta_trie(trie *nod, char s[])
{
if (s[0]=='\n')
return nod->cnt;
if (nod->a[s[0]-'a'])
return cauta_trie(nod->a[s[0]-'a'],s+1);
return 0;
}
int prefix_trie(trie *nod, char s[], int lvl)
{
if (s[0]=='\n')
return lvl;
if (nod->a[s[0]-'a'])
return prefix_trie(nod->a[s[0]-'a'],s+1,lvl+1);
return lvl;
}
int main()
{
freopen(file_in,"r",stdin);
freopen(file_out,"w",stdout);
scanf("%d ", &tip);
fgets(s,25,stdin);
while(!feof(stdin))
{
if (tip==0)
{
insert_trie(rad,s);
}
if (tip==1)
{
delete_trie(rad,s);
}
if (tip==2)
{
printf("%d\n", cauta_trie(rad,s));
}
if (tip==3)
{
printf("%d\n", prefix_trie(rad,s,0));
}
scanf("%d ", &tip);
fgets(s,25,stdin);
}
fclose(stdin);
fclose(stdout);
return 0;
}