Pagini recente » Cod sursa (job #1042261) | Cod sursa (job #1428838) | Cod sursa (job #175980) | Cod sursa (job #1635650) | Cod sursa (job #2560091)
#include<bits/stdc++.h>
#define CH (*s - 'a')
#define NMAX 200
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct Trie {
int cnt, nrfii;
Trie *fiu[ 26 ];
Trie() {
cnt = nrfii = 0;
memset( fiu, 0, sizeof( fiu ) );
}
};
Trie *T = new Trie;
void ins( Trie *nod, char *s ) {
if( *s == '\n' ) {
nod->cnt ++; return;
}
if( nod->fiu[ CH ] == 0 ) {
nod->fiu[ CH ] = new Trie;
nod->nrfii ++;
}
ins( nod->fiu[ CH ], s+1 );
}
int del( Trie *nod, char *s ) {
if( *s == '\n' )
nod->cnt --;
else if( del( nod->fiu[ CH ], s+1 ) ) {
nod->fiu[ CH ] = 0;
nod->nrfii --;
}
if( nod->cnt == 0 && nod->nrfii == 0 && nod != T ) {
delete nod; return 1;
}
return 0;
}
int que( Trie *nod, char *s ) {
if( *s == '\n' )
return nod->cnt;
if( nod->fiu[ CH ] )
return que( nod->fiu[ CH ], s+1 );
return 0;
}
int pre( Trie *nod, char *s, int k ) {
if( *s == '\n' || nod->fiu[ CH ] == 0 )
return k;
return pre( nod->fiu[ CH ], s+1, k+1 );
}
int main() {
char s[NMAX ];
while(fin.getline(s,NMAX) && s[0] ) {
int lg=strlen(s);
s[lg]='\n';
s[lg+1]=0;
switch( s[0] ) {
case '0': ins( T, s+2 ); break;
case '1': del( T, s+2 ); break;
case '2': fout<< que( T, s+2 )<<"\n" ; break;
case '3': fout<< pre( T, s+2, 0)<<"\n"; break;
}
}
return 0;
}