Pagini recente » Cod sursa (job #1256093) | Cod sursa (job #1447243) | Cod sursa (job #2932763) | Cod sursa (job #2530290) | Cod sursa (job #585477)
Cod sursa(job #585477)
#include<stdio.h>
#include<string>
#define maxL 30
FILE*f=fopen("trie.in","r");
FILE*g=fopen("trie.out","w");
int s,l,app,L,ch;
char sir[maxL];
struct Trie{
int nr,nrfii; Trie *son[27];
Trie(){
nr = nrfii = 0;
memset(son,0,sizeof(son));
}
};
Trie *r = new Trie;
void insert( Trie *nod ){
if ( s == l ){
++(nod->nr);
return ;
}
ch = sir[s] - 'a' + 1;
if ( nod->son[ ch ] == 0 ){
nod->son[ ch ] = new Trie;
(nod->nrfii)++;
}
++s;
insert( nod->son[ ch ] );
}
bool erase ( Trie *nod , int s ){
if ( s == l ){
--(nod -> nr);
}
else{
ch = sir[s] - 'a' + 1;
if ( erase( nod -> son[ ch ] , s + 1 ) ){
nod -> son[ ch ] = NULL;
--nod -> nrfii;
}
}
if ( (!(nod -> nrfii) && !(nod -> nr) && nod != r) || s == l ){
delete nod;
return 1;
}
return 0;
}
void appear ( Trie *nod ){
if ( s == l ){
app = nod -> nr;
return ;
}
ch = sir[s] - 'a' + 1;
if ( nod -> son[ ch ] && s < l ){
++s;
appear ( nod -> son[ ch ] );
}
}
void sc ( Trie *nod ){
++L;
ch = sir[s] - 'a' + 1;
if ( nod -> son[ ch ] && s < l ){
++s;
sc( nod -> son[ ch ] );
}
}
int main () {
while ( fgets(sir+1,maxL-2,f) ){
switch (sir[1]){
case '0' :{
s = 3; l = strlen(sir+1); insert(r);
break;
}
case '1' :{
l = strlen(sir+1); erase(r,3);
break;
}
case '2' :{
s = 3; app = 0; l = strlen(sir+1); appear(r);
fprintf(g,"%d\n",app );
break;
}
case '3' :{
s = 3; L = -1; l = strlen(sir+1); sc(r);
fprintf(g,"%d\n",L);
break;
}
}
}
fclose(f);
fclose(g);
return 0;
}