Pagini recente » Cod sursa (job #1930880) | Cod sursa (job #683239) | Cod sursa (job #1185721) | Cod sursa (job #2280260) | Cod sursa (job #2280557)
#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;
#define index (sir[0]-'a')
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");
//ifstream input("test20.in");
ofstream output("trie.out");
int main(){
//freopen("trie.in","rt",stdin);
//freopen("test20.in","rt",stdin);
//freopen("trie.out","wt",stdout);
root=new nod;
int tip;
char cuv[21];
//while( !feof( stdin ) ) {
while( input >> tip >> cuv){
//scanf("%c %s\n",&tip,&line);
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";
//printf("%d\n",count(line));
break;
case 3: // lungime prefix maxim
output << prefix(cuv) << "\n";
//printf("%d\n",prefix(line));
break;
}
}
input.close();
output.close();
return 0;
}