Pagini recente » Cod sursa (job #1972808) | Cod sursa (job #2152366) | Cod sursa (job #2102281) | Cod sursa (job #1679082) | Cod sursa (job #2082098)
#include <bits/stdc++.h>
#include <cstdlib>
#define val(x) (x-'a')
using namespace std;
ifstream in("trie.in");
ofstream out("trie.out");
struct trie
{
int cuv; /// nr de aparitie ale cuvantului
int nr; /// nr de cuvinte care contin secventa respectiva ca prefix
trie *fii[30]; /// vectorul in care retin legaturile dintre nodurile arborilor
} *radacina;/// radacina arborelui
void insereaza (char s[], int i, int lg, trie *nod)
{
int litera=val(s[i]); /// retin indicele literei s[i] in alfabet
if(nod->fii[litera]==NULL) /// daca nu am legatura catre litera respectiva
nod->fii[litera]=new trie;/// o creez
nod=nod->fii[litera];/// si ma mut pe nodul respectiv
nod->nr++;/// nr de aparitii ale secventei respective creste cu 1
if(i==lg-1) nod->cuv++;/// daca sunt la ultima litera cresc nr de aparitii ale cuvantului
else insereaza(s,i+1,lg,nod->fii[litera]);/// altfel inserez urmatoarea litera
}
void sterge (char s[], int i, int lg, trie *nod)
{
int litera=val(s[i]); /// retin indicele
nod=nod->fii[litera];/// trec la litera pe care o verific
nod->nr--;/// scad nr de aparitii al prefixului respectiv
if(i==lg-1) nod->cuv--;/// daca sunt la ultima litera scad nr de aparitii ale intregului cuvant
else sterge(s,i+1,lg,nod);/// altfel sterg urmatoare litera
}
int numara (char s[], int i, int lg, trie *nod)
{
int litera=val(s[i]);
nod=nod->fii[litera]; /// ma mut pe nodul literei pe care o verific
if(nod==NULL || nod->nr==0) return 0;/// daca nodul meu este NULL sau daca prefixul parcurs pana acum apare de 0 ori inseamna ca cuvantul respectiv nu apare
else if(i==lg-1) return nod->cuv; /// daca sunt la ultima litera atunci returnez nr de aparitii al cuvantului
else numara(s,i+1,lg,nod);/// altfel trec la urmatoarea litera
}
int pref;
void prefix (char s[], int i, int lg, trie *nod)
{
int litera=val(s[i]);
nod=nod->fii[litera]; /// trec la nodul literei in chestiune
if(nod==NULL || nod->nr<1) return;/// daca nodul nu exista sau prefixul nu exista ma opresc
pref++;/// cresc lungimea prefixului pe care l-am gasit pana acum
if(i!=lg-1) prefix(s,i+1,lg,nod);/// daca nu am ajuns la ultima litera ma opresc
}
int op;char s[30];
int main()
{
radacina=new trie;
radacina->cuv=0;
radacina->nr=0;
while(in>>op>>s)
{
switch(op)
{
case 0:
insereaza(s,0,strlen(s),radacina);
break;
case 1:
sterge(s,0,strlen(s),radacina);
break;
case 2:
out<<numara(s,0,strlen(s),radacina)<<'\n';
break;
case 3:
pref=0;
prefix(s,0,strlen(s),radacina);
out<<pref<<'\n';
break;
}
}
return 0;
}