Pagini recente » Cod sursa (job #2570075) | Cod sursa (job #1982597) | Cod sursa (job #2562518) | Cod sursa (job #1769336) | Cod sursa (job #2280143)
#include<stdio.h>
#include<string.h>
#include<fstream>
#include<iostream>
using namespace std;
#define MAXL 20
#define ALFSIZE 26
typedef struct nod{
int freq;
int nbcuv;
nod* fii[ALFSIZE];
}nod;
nod* root;
void add(char* sir){
int l=strlen(sir);
nod* crt=root;
int index;
for(int i=0;i<l-1;i++){
crt->nbcuv++;
index=sir[i]-'a';
if(crt->fii[index]==NULL){
nod* aux=new nod;
crt->fii[index]=aux;
for(int j=0;j<ALFSIZE;j++)
aux->fii[j]=NULL;
aux->freq=0;
aux->nbcuv=0;
crt=aux;
}
else{
crt=crt->fii[index];
}
}
// ultimul caracter
crt->nbcuv++;
index=sir[l-1]-'a';
if(crt->fii[index]==NULL){
nod* aux=new nod;
crt->fii[index]=aux;
for(int j=0;j<ALFSIZE;j++)
aux->fii[j]=NULL;
aux->freq=1;
aux->nbcuv=1;
}
else{
crt=crt->fii[index];
crt->freq++;
crt->nbcuv++;
}
}
void remove(char* sir){
int l=strlen(sir);
nod* crt=root, *parent=NULL;
int index;
for(int i=0;i<l;i++){
index=sir[i]-'a';
parent=crt;
crt=crt->fii[index];
crt->nbcuv--;
if(crt->nbcuv==0){
// stergem ramura
parent->fii[index]=NULL;
for(int j=i+1;j<l;j++){
index=sir[j]-'a';
parent=crt;
crt=crt->fii[index];
delete parent;
}
delete crt;
return;
}
}
crt->freq--;
}
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");
ofstream output("trie.out");
int main(){
//freopen("trie.in","rt",stdin);
//freopen("trie.out","wt",stdout);
root=new nod;
root->freq=0;
root->nbcuv=0;
for(int j=0;j<ALFSIZE;j++)
root->fii[j]=NULL;
int tip,rez;
char cuv[MAXL+1];
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;
}