Pagini recente » Cod sursa (job #2261212) | Cod sursa (job #1540283) | Cod sursa (job #2669772) | Cod sursa (job #2370670) | Cod sursa (job #2636244)
#include <fstream>
#include <cstring>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct Trie{
int nrfii, cnt;
Trie* fiu[26];
Trie () {
nrfii = cnt = 0;
memset(fiu, 0, sizeof(fiu));
}
};
Trie *root = new Trie;
char line[25];
void ins( Trie* node, char *s ) {
if( *s == '\0' ) {
node->cnt ++;
return ;
}
int ch = *s - 'a';
if( node->fiu[ch] == 0 ) {
node->fiu[ch] = new Trie;
node->nrfii ++;
}
ins(node->fiu[ch], s + 1);
}
bool del( Trie* node, char *s ) {
int ch = *s - 'a';
if( *s == '\0' ) {
node->cnt --;
}
else if( del(node->fiu[ch], s + 1) ) {
node->fiu[ch] = 0;
node->nrfii --;
}
if( node->nrfii == 0 && node->cnt == 0 && node != root ) {
delete node;
return true;
}
return false;
}
int ap( Trie* node, char* s ) {
if( *s == '\0' )
return node->cnt;
int ch = *s - 'a';
if( node->fiu[ch] != 0 )
return ap(node->fiu[ch], s + 1);
else
return 0;
}
int prefix( Trie* node, char* s ) {
int ch = *s - 'a';
if( *s == '\0' || node->fiu[ch] == 0 )
return 0;
return 1 + prefix(node->fiu[ch], s + 1);
}
int main() {
int op;
while( fin>>op>>line ) {
switch( op ) {
case 0: ins( root, line ); break;
case 1: del( root, line ); break;
case 2: fout<<ap( root, line )<<"\n"; break;
case 3: fout<<prefix( root, line )<<"\n"; break;
}
}
return 0;
}