Pagini recente » Cod sursa (job #1731857) | Cod sursa (job #2384530) | Cod sursa (job #1336767) | Cod sursa (job #2389615) | Cod sursa (job #581514)
Cod sursa(job #581514)
#include <cstdio>
using namespace std;
#define Input "trie.in"
#define Output "trie.out"
struct Trie{
Trie *fii[26];
int cnt,nrfii;
} *R = NULL;
inline void creaza(Trie *&nod)
{
int i;
nod = new Trie;
nod->cnt = 0;
nod->nrfii = 0;
for(i=0; i<26; i++)
nod->fii[i] = NULL;
}
inline void insert(Trie *T,char *sir)
{
if(*sir!='\n')
if(T->fii[*sir-'a'])
insert(T->fii[*sir-'a'],sir+1);
else
creaza(T->fii[*sir-'a']),T->nrfii++, insert(T->fii[*sir-'a'],sir+1);
else
T->cnt++;
}
inline int sterge(Trie *T,char *sir)
{
if(*sir == '\n')
T->cnt--;
else
if(sterge(T->fii[*sir-'a'],sir+1))
T->fii[*sir-'a']=NULL, T->nrfii--;
if(T->cnt == 0 && T->nrfii == 0 && T!=R)
{ delete T; return 1; }
return 0;
}
inline int count(Trie *T,char *sir)
{
if(*sir != '\n')
if(T->fii[*sir-'a'])
return 0+count(T->fii[*sir-'a'],sir+1);
else
return 0;
else
return T->cnt;
}
inline int LCP(Trie *T,char *sir){
if(*sir!='\n' && T->fii[*sir-'a'])
return 1+LCP(T->fii[*sir-'a'],sir+1);
return 0;
}
int main()
{
char line[200];
freopen (Input,"r",stdin);
freopen (Output,"w",stdout);
creaza(R);
while(!feof(stdin))
{
fgets(line,100,stdin);
switch(line[0])
{
case '0':insert(R,line+2);break;
case '1':sterge(R,line+2);break;
case '2':printf("%d\n",count(R,line+2));break;
case '3':printf("%d\n",LCP(R,line+2));break;
}
line[0] = '5';
}
return 0;
}