Pagini recente » Cod sursa (job #2544504) | Cod sursa (job #3239814) | Cod sursa (job #2935182) | Cod sursa (job #2619139) | Cod sursa (job #416807)
Cod sursa(job #416807)
# include <algorithm>
# include <fstream>
# include <string>
using namespace std;
# define Alf 26
const char Input[] = "trie.in";
const char Output[] = "trie.out";
struct trie {
int cnt, nr_fii;
trie *fiu[ Alf ];
trie() {
cnt = nr_fii = 0;
memset( fiu, 0, sizeof( fiu ) );
}
};
string s;
trie *t = new trie;
void ins( trie *nod, const string :: iterator it ) {
if( it == s.end() ) {
++nod->cnt;
return;
}
if( nod->fiu[ *it - 'a' ] == 0 ) {
nod->fiu[ *it - 'a' ] = new trie;
++nod->nr_fii;
}
ins( nod->fiu[ *it - 'a' ], it + 1 );
}
int del( trie *nod, const string :: iterator it ) {
if( it == s.end() )
--nod->cnt;
else if( del( nod->fiu[ *it - 'a' ], it + 1 ) ) {
nod->fiu[ *it - 'a' ] = 0;
--nod->nr_fii;
}
if( nod->cnt == 0 && nod->nr_fii == 0 && nod != t ) {
delete nod;
return 1;
}
return 0;
}
int que( trie *nod, const string :: iterator it ) {
if( it == s.end() )
return nod->cnt;
if( nod->fiu[ *it - 'a' ] )
return que( nod->fiu[ *it - 'a' ], it + 1 );
return 0;
}
int pre( trie *nod, const string :: iterator it, const int &k ) {
if( it == s.end() )
return k;
if( nod->fiu[ *it - 'a' ] == 0 )
return k;
return pre( nod->fiu[ *it - 'a' ], it + 1, k + 1 );
}
int main() {
ifstream fin( Input );
ofstream fout( Output );
int tip;
while( fin >> tip ) {
fin >> s;
if( tip == 0 ) {
ins( t, s.begin() );
continue;
}
if( tip == 1 ) {
del( t, s.begin() );
continue;
}
if( tip == 2 ) {
fout << que( t, s.begin() ) << "\n";
continue;
}
if( tip == 3 ) {
fout << pre( t, s.begin(), 0 ) << "\n";
continue;
}
}
fin.close();
fout.close();
return 0;
}