Pagini recente » Cod sursa (job #651951) | Cod sursa (job #1665674) | Cod sursa (job #80319) | Cod sursa (job #975539) | Cod sursa (job #934046)
Cod sursa(job #934046)
#include<iostream>
#include<fstream>
#include<string.h>
using namespace std;
#define alfa 27
#define LMAX 22
struct Trie {
int nr,fii;
Trie *urm[alfa];
};
typedef Trie* T;
T rad;
char sir[LMAX];
T creare()
{
T nou;
nou=new Trie;
nou->nr=0;
nou->fii=0;
memset(nou->urm,0,sizeof(nou->urm));
return nou;
}
void adauga(T p, char *s)
{
if(*s=='\n') {
p->nr++;
return ;
}
if(p->urm[*s-'a'])
adauga(p->urm[*s-'a'],s+1);
else {
p->urm[*s-'a']=creare();
p->fii++;
adauga(p->urm[*s-'a'],s+1);
}
}
int sterge(T p, char *s)
{
if(*s=='\n')
p->nr--;
else if(sterge(p->urm[*s-'a'],s+1)) {
p->urm[*s-'a']=0;
p->fii--;
}
if(p->nr==0 && p->fii==0 && p!=rad) {
delete p;
return 1;
}
return 0;
}
int cauta(T p, char *s)
{
if(*s=='\n')
return p->nr;
if(p->urm[*s-'a'])
return cauta(p->urm[*s-'a'],s+1);
return 0;
}
int prefix(T p, char *s)
{
if(*s=='\n')
return 0;
else if(p->urm[*s-'a'])
return 1+prefix(p->urm[*s-'a'],s+1);
else return 0;
}
int main()
{
int op;
ifstream f("trie.in");
ofstream g("trie.out");
rad=creare();
while(f.peek()!=EOF) {
memset(sir,0,sizeof(sir));
f>>op>>sir;
sir[strlen(sir)]='\n';
if(op==0)
adauga(rad,sir);
else if(op==1)
sterge(rad,sir);
else if(op==2)
g<<cauta(rad,sir)<<'\n';
else g<<prefix(rad,sir)<<'\n';
}
f.close();
g.close();
return 0;
}