Pagini recente » Cod sursa (job #2277162) | Cod sursa (job #610219) | Cod sursa (job #954768) | Cod sursa (job #1029477) | Cod sursa (job #2280354)
#include<stdio.h>
#include<string.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;
void addcuv(char* sir){
int l=strlen(sir);
nod* crt=root;
int index;
for(int i=0;i<l;i++){
index=sir[i]-'a';
if(crt->fii[index]==NULL){
nod* aux=new nod;
crt->fii[index]=aux;
crt->nbfii++;
crt=aux;
}
else{
crt=crt->fii[index];
}
}
// ultimul caracter
crt->freq++;
}
bool removecuv(char* sir,nod* p){
if(sir[0]==0){
p->freq--;
}
else{
int index=sir[0]-'a';
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){
int l=strlen(sir);
nod* crt=root;
int index;
for(int i=0;i<l;i++){
index=sir[i]-'a';
if(crt->fii[index]==NULL){
return 0;
}
else{
crt=crt->fii[index];
}
}
// am parcurs tot sirul
return crt->freq;
}
int prefix(char* sir){
int l=strlen(sir);
nod* crt=root;
int index,prefix=0;
for(int i=0;i<l;i++){
index=sir[i]-'a';
if(crt->fii[index]==NULL){
return prefix;
}
else{
crt=crt->fii[index];
prefix++;
}
}
return prefix;
}
//ifstream input("trie.in");
//ifstream input("test13.in");
//ofstream output("trie.out");
int line;
int main(){
freopen("trie.in","rt",stdin);
//freopen("test9.in","rt",stdin);
freopen("trie.out","wt",stdout);
root=new nod;
int tip,rez;
char cuv[MAXL+1];
int err=0;
while( !feof( stdin ) ) {
scanf("%d %s\n",&tip,&cuv);
switch(tip){
case 0: // adauga o aparitie
addcuv(cuv);
break;
case 1: // sterge o aparitie
removecuv(cuv,root);
break;
case 2: // numarul de aparitii
rez=count(cuv);
printf("%d\n",rez);
//output << rez << endl;
break;
case 3: // lungime prefix maxim
rez=prefix(cuv);
//output << rez << endl;
printf("%d\n",rez);
break;
}
}
/*
while (input >> tip >> cuv) {
switch(tip){
case 0: // adauga o aparitie
add(cuv);
break;
case 1: // sterge o aparitie
remove(cuv);
break;
case 2: // numarul de aparitii
rez=count(cuv);
output << rez << endl;
break;
case 3: // lungime prefix maxim
rez=prefix(cuv);
output << rez << endl;
break;
}
}
*/
//input.close();
//output.close();
return 0;
}