Pagini recente » Cod sursa (job #1239884) | Cod sursa (job #3261441) | Cod sursa (job #1792638) | Cod sursa (job #1528587) | Cod sursa (job #1891567)
#include <fstream>
#include <string>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
#define ch cuv[ pos ] - 'a'
struct Trie {
int ap, sons;
Trie *fii[ 26 ];
Trie() {
ap = sons = 0;
for (int i = 0 ; i < 26 ; i++) fii[ i ] = NULL;
}
};
int op, maxi;
Trie *trieRoot = new Trie;
string cuv;
void addTrie( Trie *&aux, int pos ) {
if ( pos >= cuv.length() ) {
aux -> ap ++;
} else {
if ( aux -> fii[ ch ] == 0 ) {
aux -> sons ++;
aux -> fii[ ch ] = new Trie;
}
addTrie( aux -> fii[ ch ] , pos + 1 );
}
}
void delTrie( Trie *&aux, int pos ) {
if ( pos >= cuv.length() ) {
aux -> ap --;
if ( aux -> ap == 0 && aux -> sons == 0 ) {
delete aux;
aux = NULL;
}
} else if ( aux -> fii[ ch ] == NULL ) {
return;
} else {
delTrie( aux -> fii[ ch ] , pos + 1 );
if ( aux -> fii[ ch ] == NULL ) {
aux -> sons --;
if ( aux -> ap == 0 && aux -> sons == 0 ) {
delete aux;
aux = NULL;
}
}
}
}
int cntTrie( Trie *&aux, int pos ) {
if ( pos >= cuv.length() ) {
return aux -> ap;
} else if ( aux -> fii[ ch ] == NULL ) {
return 0;
} else {
return cntTrie( aux -> fii[ ch ] , pos + 1 );
}
}
int prfixTrie( Trie *&aux, int pos ) {
if ( aux -> fii[ ch ] && ( aux -> fii[ ch ] -> sons || aux -> fii[ ch ] -> ap ) )
return prfixTrie( aux -> fii[ ch ] , pos + 1 );
else
return pos;
}
int main()
{
while (fin>>op) {
fin>>cuv;
if (op == 0) {
addTrie(trieRoot, 0);
} else if (op == 1) {
delTrie(trieRoot, 0);
} else if (op == 2) {
fout<<cntTrie(trieRoot, 0)<<'\n';
} else {
fout<<prfixTrie(trieRoot, 0)<<'\n';
}
}
return 0;
}