Pagini recente » Cod sursa (job #466115) | Cod sursa (job #379509) | Cod sursa (job #2061219) | Cod sursa (job #264706) | Cod sursa (job #377311)
Cod sursa(job #377311)
#include <stdio.h>
const char INPUT[] = "trie.in";
const char OUTPUT[] = "trie.out";
const int LEN_CUV = 21;
const int NR_FII = 26;
struct nod
{
nod *next[NR_FII];
int info;
}*root;
void init(nod *&p)
{
p = new nod;
p -> info = 0;
int i;
for(i = 0; i < NR_FII; ++i)
p -> next[i] = NULL;
}
void insert(nod *r, char *cuv)
{
if(*cuv == NULL)
{
++(r -> info);
return;
}
if(r -> next[ *cuv - 'a'] != NULL)
{
insert(r -> next[ *cuv - 'a'], cuv + 1);
return;
}
init(r -> next[ *cuv - 'a']);
insert(r -> next[ *cuv - 'a'], cuv + 1);
}
void deleteNod(nod *&r, char *cuv)
{
if(*cuv == NULL)
{
--(r -> info);
return;
}
if(r -> next[*cuv - 'a'] == NULL) ; //printf("ERROR!! %s\n", cuv);
else deleteNod(r -> next[*cuv - 'a'], cuv+1);
}
int countApar(nod *r, char *cuv)
{
if(*cuv == NULL) return r -> info;
if(r -> next[ *cuv - 'a' ] == NULL) return 0;
return countApar(r -> next[ *cuv - 'a' ], cuv+1);
}
int prefix(nod *r, char *cuv)
{
if(*cuv == NULL || r -> next[*cuv - 'a'] == NULL)
return 0;
return 1 + prefix(r -> next[*cuv - 'a'], cuv + 1);
}
int main()
{
freopen(INPUT, "r", stdin);
freopen(OUTPUT, "w", stdout);
init(root);
while(!feof(stdin))
{
int nr;
char* cuv = new char[LEN_CUV];
scanf("%d %s\n", &nr, cuv);
if(nr == 0) insert(root, cuv);
else if(nr == 1) deleteNod(root, cuv);
else if(nr == 2) printf("%d\n", countApar(root, cuv));
else printf("%d\n", prefix(root, cuv));
}
return 0;
}