Pagini recente » Cod sursa (job #902553) | Cod sursa (job #2972052) | Cod sursa (job #2315744) | Cod sursa (job #2681454) | Cod sursa (job #2280581)
#include<stdio.h>
#include <cstring>
#include <fstream>
#include <iostream>
#include<vector>
#include<algorithm>
using namespace std;
#define MAXL 20
#define ALFSIZE 26
typedef struct nod{
int freq, nbfii;
unsigned char car;
vector<nod*> fii;
nod() {
freq = nbfii = 0;
}
}nod;
nod* root;
vector<nod*>::iterator findcar(vector<nod*> & v,char c){
vector<nod*>::iterator it;
for(it=v.begin();it!=v.end();it++){
if((*it)->car==c)
return it;
}
return v.end();
}
void addcuv(char* sir){
nod* crt=root, *aux;
vector<nod*>::iterator it;
while(sir[0]){
it=findcar(crt->fii,sir[0]);
if(it==crt->fii.end()){
aux=new nod;
aux->car=sir[0];
crt->fii.push_back(aux);
crt->nbfii++;
crt=aux;
}
else{
crt=*it;
}
sir++;
}
// ultimul caracter
crt->freq++;
}
bool removecuv(char* sir,nod* p){
if(sir[0]==0){
p->freq--;
}
else{
vector<nod*>::iterator it;
it=findcar(p->fii,sir[0]);
bool del=removecuv(sir+1,*it);
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;
while(sir[0]){
vector<nod*>::iterator it;
it=findcar(crt->fii,sir[0]);
if(it==crt->fii.end()){
return 0;
}
else{
crt=*it;
}
sir++;
}
// am parcurs tot sirul
return crt->freq;
}
int prefix(char* sir){
nod* crt=root;
int prefix=0;
while(sir[0]){
vector<nod*>::iterator it;
it=findcar(crt->fii,sir[0]);
if(it==crt->fii.end()){
return prefix;
}
else{
crt=*it;
prefix++;
}
sir++;
}
return prefix;
}
ifstream input("trie.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;
}