Pagini recente » Cod sursa (job #2975460) | Cod sursa (job #1340273) | Cod sursa (job #1652166) | Cod sursa (job #2598849) | Cod sursa (job #357403)
Cod sursa(job #357403)
#include <stdio.h>
#include <string.h>
#define sigma 27
#define Ls 35
using namespace std;
struct Trie{
int nrc,nrf;
Trie *son[sigma];
Trie(){
nrc=nrf=0;
memset(son,0,sizeof(son));
}
};
Trie *T = new Trie;
char s[Ls];
void add(Trie *t, char *s){
if( *s == '\n' ){
t->nrc++;
return ;
}
if( t-> son[( *s-'a' )] )
add(t-> son[( *s-'a' )], s+1);
else{
t-> son[(*s-'a')] = new Trie;
t->nrf++;
add(t-> son[( *s-'a' )],s+1);
}
}
int del(Trie *t, char *s){
if( *s == '\n' )
t->nrc--; else
if( del( t-> son[( *s-'a' )], s+1 )){
t-> son[(*s-'a')] =0;
t-> nrf --;
}
if( t->nrc == 0 && t->nrf == 0 && t!=T){
delete t; return 1;
}
return 0;
}
int numw( Trie *t, char *s){
if ( *s == '\n' )
return t->nrc;
if( t-> son[( *s-'a' )])
return numw(t-> son[( *s-'a') ] , s+1);
return 0;
}
int numpr( Trie *t, char *s,int q){
if( *s=='\n' || t-> son[( *s-'a' )] == 0 )
return q;
return numpr(t-> son[( *s-'a' )], s+1, q+1);
}
int main(){
freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
for( fgets(s,Ls,stdin); !feof(stdin); fgets(s,Ls,stdin)){
switch( s[0] ){
case '0' : add(T,s+2); break;
case '1' : del(T,s+2); break;
case '2' : printf("%d\n",numw(T,s+2)); break;
case '3' : printf("%d\n",numpr(T,s+2,0)); break;
}
}
fclose(stdin); fclose(stdout);
return 0;
}