Pagini recente » Cod sursa (job #3291950) | Cod sursa (job #269586) | Cod sursa (job #3249248) | Cod sursa (job #2704343) | Cod sursa (job #283443)
Cod sursa(job #283443)
#include<stdio.h>
#include<string.h>
#define INPUT "trie.in"
#define OUTPUT "trie.out"
FILE *fin = fopen(INPUT, "r"), *fout = fopen(OUTPUT, "w");
struct Trie
{
int Letter, nrChild;
Trie *Child[ 26 ];
Trie(){
Letter = 0, nrChild = 0;
memset(Child, 0, sizeof(Child));
}
};
Trie *Tr = new Trie;
void add(Trie* T, char* S)
{
fprintf(stderr, "%c\n", *S);
if(*S == '\n'){
T -> Letter ++; return;
}
if(T -> Child[ *S - 'a' ] == 0)
{
T -> Child[ *S - 'a' ] = new Trie;
T -> nrChild ++;
}
add(T -> Child[ *S - 'a' ], S+1);
}
int remove(Trie* T, char* S)
{
if(*S == '\n')
T -> Letter --;
else
if( remove(T -> Child[ *S - 'a' ], S+1))
{
T -> nrChild --;
T -> Child[ *S -'a' ] = 0;
}
if(T -> nrChild == 0 && T -> Letter == 0 && T != Tr)
{
delete T;
return 1;
}
return 0;
}
int number(Trie* T, char* S)
{
if(*S == '\n')
return T -> Letter;
if(T -> Child[ *S - 'a' ])
return number( T-> Child[ *S -'a'], S+1);
return 0;
}
int prefix(Trie* T, char* S, int k)
{
if(*S == '\n' || T -> Child[ *S -'a' ] == 0)
return k;
return prefix(T-> Child[ *S - 'a' ], S+1, k+1);
}
int main()
{
int Code;
char S[ 32 ];
fgets( S, 32, fin);
while(!feof(fin)){
fprintf(stderr, "%d\n", strlen(S));
switch(S[ 0 ])
{
case '0': add(Tr, S+2); break;
case '1': remove(Tr, S+2); break;
case '2': fprintf(fout, "%d\n", number(Tr, S+2)); break;
case '3': fprintf(fout, "%d\n", prefix(Tr, S+2, 0)); break;
}
fgets(S, 32, fin);
}
fclose(fin);
fclose(fout);
}