Pagini recente » Cod sursa (job #585353) | Cod sursa (job #67270) | Cod sursa (job #467887) | Cod sursa (job #1502673) | Cod sursa (job #585473)
Cod sursa(job #585473)
#include<stdio.h>
#include<string>
#define maxL 23
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 ( sir[s] == '\n' ){
++(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 ( sir[s] == '\n' ){
--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 ){
delete nod;
return 1;
}
return 0;
}
void appear ( Trie *nod ){
if ( sir[s] == '\n' ){
app = nod -> nr;
return ;
}
ch = sir[s] - 'a' + 1;
if ( nod -> son[ ch ] ){
++s;
appear ( nod -> son[ ch ] );
}
}
void sc ( Trie *nod ){
++L;
ch = sir[s] - 'a' + 1;
if ( nod -> son[ ch ] && sir[s] != '\n' ){
++s;
sc( nod -> son[ ch ] );
}
}
int main () {
while ( fgets(sir+1,maxL,f) ){
switch (sir[1]){
case '0' :{
s = 3; insert(r);
break;
}
case '1' :{
erase(r,3);
break;
}
case '2' :{
s = 3; app = 0; appear(r);
fprintf(g,"%d\n",app );
break;
}
case '3' :{
s = 3; L = -1; sc(r);
fprintf(g,"%d\n",L);
break;
}
}
}
fclose(f);
fclose(g);
return 0;
}