Pagini recente » Cod sursa (job #940435) | Cod sursa (job #720123) | Cod sursa (job #1617864) | Cod sursa (job #3251337) | Cod sursa (job #406544)
Cod sursa(job #406544)
#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;
#define SIGMA 26
#define FIN "trie.in"
#define FOUT "trie.out"
struct Trie
{
int cnt, nrfii;
Trie *fii[ SIGMA ];
Trie()
{
cnt = nrfii = 0;
memset (fii, 0, sizeof(fii));
}
};
Trie *T = new Trie;
void insert( char *s )
{
Trie *nod = T;
int q;
do
{
if (*s == '\n') { nod->cnt++; return; }
q = *s - 'a';
if ( !nod->fii[q] )
{
nod->fii[q] = new Trie;
nod->nrfii++;
}
s++;
nod = nod->fii[q];
} while (1);
}
bool del( Trie *nod, char *s )
{
int q = *s-'a';
if (*s == '\n') nod->cnt--;
else if ( del( nod->fii[q], s+1 ) )
nod->nrfii--, nod->fii[q] = 0;
if (nod->cnt == 0 && nod->nrfii == 0 && nod != T)
{
delete nod; return true;
}
return false;
}
int numara( char *s )
{
Trie *nod = T;
int q;
do
{
if (*s == '\n')
{
return (nod->cnt);
}
q = *s-'a';
if ( !nod->fii[q] ) return 0;
nod = nod->fii[q];
s++;
} while (1);
}
int prefix( char *s )
{
Trie *nod = T;
int q,k=0;
do
{
q = *s-'a';
if (*s == '\n' || !nod->fii[q]) return k;
k++;
s++;
nod = nod->fii[q];
} while (1);
}
int main()
{
freopen( FIN, "r", stdin );
freopen( FOUT, "w", stdout );
char line[32];
fgets ( line, 32, stdin );
while ( !feof( stdin ) )
{
switch (line[0])
{
case '0' : insert( line+2 ); break;
case '1' : del( T, line+2 ); break;
case '2' : printf ( "%d\n", numara( line+2 ) ); break;
case '3' : printf ( "%d\n", prefix( line+2 ) ); break;
}
fprintf(stderr, "\n");
fgets ( line, 32, stdin );
}
return EXIT_SUCCESS;
}