Pagini recente » Cod sursa (job #2989794) | Cod sursa (job #1205956) | Cod sursa (job #93447) | Cod sursa (job #2118601) | Cod sursa (job #1602311)
#include<fstream>
#include<string>
using namespace std;
ifstream fin( "trie.in" ); ofstream fout( "trie.out" );
const int omega = 26;
struct Trie{
int nrfii, nrcuv;
Trie *lit[ omega ];
Trie() {
for( int i = 0; i < omega; ++ i ) {
lit[ i ] = NULL;
}
nrfii = 0, nrcuv = 0;
}
};
Trie *rad;
string s;
void adauga( Trie *nod, int pos ) {
if ( pos == ( int )s.size() ) {
++ nod -> nrcuv;
return ;
}
int x = s[ pos ] - 'a';
if ( nod -> lit[ x ] == NULL ) {
nod -> lit[ x ] = new() Trie;
++ nod -> nrfii;
}
adauga( nod -> lit[ x ], pos + 1 );
}
bool sterge( Trie *nod, int pos ) {
if ( pos == ( int )s.size() ) {
-- nod -> nrcuv;
} else if ( sterge( nod -> lit[ s[ pos ] - 'a' ], pos + 1 ) ) {
-- nod -> nrfii;
nod -> lit[ s[ pos ] - 'a' ] = NULL;
}
if ( nod -> nrcuv == 0 && nod -> nrfii == 0 && nod != rad ) {
delete nod;
return 1;
}
return 0;
}
int cate( Trie *nod, int pos ) {
if ( pos == ( int )s.size() ) {
return nod -> nrcuv;
}
if ( nod -> lit[ s[ pos ] - 'a' ] == NULL ) {
return 0;
}
return cate( nod -> lit[ s[ pos ] - 'a' ], pos + 1 );
}
int prefix( Trie *nod, int pos ) {
if ( pos == ( int )s.size() || nod -> lit[ s[ pos ] - 'a' ] == NULL ) {
return 0;
}
return prefix( nod -> lit[ s[ pos ] - 'a' ], pos + 1 ) + 1;
}
int main() {
int op;
rad = new Trie();
while ( fin >> op ) {
fin >> s;
switch( op ) {
case 0 : {
adauga( rad, 0 ); break;
}
case 1 : {
sterge( rad, 0 ); break;
}
case 2 : {
fout << cate( rad, 0 ) << "\n"; break;
}
default : {
fout << prefix( rad, 0 ) << "\n"; break;
}
}
}
fin.close();
fout.close();
return 0;
}