Pagini recente » Cod sursa (job #1861965) | Cod sursa (job #2861127) | Cod sursa (job #700167) | Cod sursa (job #344122) | Cod sursa (job #2280511)
#include<stdio.h>
#include <cstring>
using namespace std;
#define MAXL 20
#define ALFSIZE 26
typedef struct nod{
int freq, nbfii;
nod* fii[ALFSIZE];
nod() {
freq = nbfii = 0;
memset( fii, NULL, sizeof( fii ) );
}
}nod;
nod* root;
#define index (sir[0]-'a')
void addcuv(char* sir){
nod* crt=root;
while(sir[0]){
if(crt->fii[index]==NULL){
crt->fii[index]=new nod;
crt->nbfii++;
}
crt=crt->fii[index];
sir++;
}
// ultimul caracter
crt->freq++;
}
bool removecuv(char* sir,nod* p){
if(sir[0]==0){
p->freq--;
}
else{
bool del=removecuv(sir+1,p->fii[index]);
if(del){
p->fii[index]=NULL;
p->nbfii--;
}
}
if(p->freq==0 && p->nbfii==0 && p!=root){
delete p;
return true;
}
else
return false;
}
int count(char* sir){
nod* crt=root;
while(sir[0]){
if(crt->fii[index]==NULL){
return 0;
}
else{
crt=crt->fii[index];
}
sir++;
}
// am parcurs tot sirul
return crt->freq;
}
int prefix(char* sir){
nod* crt=root;
int prefix=0;
while(sir[0]){
if(crt->fii[index]==NULL){
return prefix;
}
else{
crt=crt->fii[index];
prefix++;
}
sir++;
}
return prefix;
}
int main(){
freopen("trie.in","rt",stdin);
//freopen("test20.in","rt",stdin);
freopen("trie.out","wt",stdout);
root=new nod;
char tip,line[21];
while( !feof( stdin ) ) {
scanf("%c %s\n",&tip,&line);
switch(tip){
case '0': // adauga o aparitie
addcuv(line);
break;
case '1': // sterge o aparitie
removecuv(line,root);
break;
case '2': // numarul de aparitii
printf("%d\n",count(line));
break;
case '3': // lungime prefix maxim
printf("%d\n",prefix(line));
break;
}
}
return 0;
}