Pagini recente » Cod sursa (job #321291) | Cod sursa (job #1249658) | Cod sursa (job #1464728) | Cod sursa (job #332653) | Cod sursa (job #602100)
Cod sursa(job #602100)
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<malloc.h>
#include<ctype.h>
#define MaxL 30
#define MaxN 21
typedef struct _trie
{
int info;
int infop;
struct _trie *L[MaxL];
} Trie;
Trie *cap = NULL;
int N;
int stare;
char S[MaxN];
void Creat(Trie*& P)
{
P = (Trie*)malloc(sizeof(Trie));
P->info = P->infop = 0;
for(int i=0;i<MaxL;i++)
P->L[i] = NULL;
}
void add(Trie*& p,int i,char S[MaxN])
{
if(!p)
Creat(p);
if(!p->L[S[i]-'a'])
p->infop ++;
if(isalpha(S[i]))
add(p->L[S[i]-'a'] , i + 1 , S);
else
p->info ++;
}
void TrieDelete(Trie*& p,int i,char S[MaxN])
{
if(isalpha(S[i]))
TrieDelete(p->L[S[i]-'a'],i+1,S);
else
p->info --;
if(!p->L[S[i]-'a'])
p->infop --;
if(p->infop == 0)
p = NULL;
}
int TrieNrAp(Trie*& p,int i,char S[MaxN])
{
if(!p)
return 0;
if(isalpha(S[i]))
return TrieNrAp(p->L[S[i]-'a'] , i + 1 , S);
else
return p->info;
}
int TrieMaxPre(Trie*& p,int i,char S[MaxN],int MAX)
{
if(!p)
return MAX;
//if(p->infop > 1)
//MAX = i;
if(isalpha(S[i]) && p->L[S[i]-'a'])
return TrieMaxPre(p->L[S[i]-'a'] , i + 1 , S , MAX+1);
else
return MAX;
}
int main()
{
freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
while((scanf("%d",&stare)!=EOF) && (scanf("%s",S)!=EOF))
{
switch(stare)
{
case 0 : add(cap,0,S);
break;
case 1 : TrieDelete(cap,0,S);
break;
case 2 : printf("%d\n",TrieNrAp(cap,0,S));
break;
case 3 : printf("%d\n",TrieMaxPre(cap,0,S,0));
break;
default : break;
}
}
return 0;
}