Pagini recente » Cod sursa (job #1275532) | Cod sursa (job #166147) | Cod sursa (job #1884459) | Cod sursa (job #1836468) | Cod sursa (job #2280579)
#include<stdio.h>
#include <cstring>
#include <fstream>
#include <iostream>
#include<map>
#include <utility>
using namespace std;
#define MAXL 20
typedef struct nod{
int freq, nbfii;
map<unsigned char,nod*> fii;
nod() {
freq = nbfii = 0;
}
}nod;
nod* root;
void addcuv(char* sir){
nod* crt=root, *aux;
map<unsigned char,nod*>::iterator it;
while(sir[0]){
it=crt->fii.find(sir[0]);
if(it==crt->fii.end()){
aux=new nod;
crt->fii.insert(make_pair(sir[0],aux));
crt->nbfii++;
crt=aux;
}
else{
crt=it->second;
}
sir++;
}
// ultimul caracter
crt->freq++;
}
bool removecuv(char* sir,nod* p){
if(sir[0]==0){
p->freq--;
}
else{
map<unsigned char,nod*>::iterator it;
it=p->fii.find(sir[0]);
bool del=removecuv(sir+1,it->second);
if(del){
p->fii.erase(it);
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;
map<unsigned char,nod*>::iterator it;
while(sir[0]){
it=crt->fii.find(sir[0]);
if(it==crt->fii.end()){
return 0;
}
else{
crt=it->second;
}
sir++;
}
// am parcurs tot sirul
return crt->freq;
}
int prefix(char* sir){
nod* crt=root;
int prefix=0;
map<unsigned char,nod*>::iterator it;
while(sir[0]){
it=crt->fii.find(sir[0]);
if(it==crt->fii.end()){
return prefix;
}
else{
crt=it->second;
prefix++;
}
sir++;
}
return prefix;
}
ifstream input("trie.in");
//ifstream input("test20.in");
ofstream output("trie.out");
int main(){
root=new nod;
int tip;
char cuv[21];
while( input >> 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
output << count(cuv) << "\n";
break;
case 3: // lungime prefix maxim
output << prefix(cuv) << "\n";
break;
}
}
input.close();
output.close();
return 0;
}