Pagini recente » Cod sursa (job #3198381) | Cod sursa (job #1056221) | Cod sursa (job #666958) | Cod sursa (job #1283692) | Cod sursa (job #1737826)
#include <fstream> // |^C
#include <cstring>
#define ch (*s-'a')
using namespace std;
ifstream fi("trie.in");
ofstream fo("trie.out");
struct Trie{
int nr_fii;
int nr_cuv;
Trie *fiu[26];
Trie()
{
nr_fii=0;
nr_cuv=0;
memset(fiu,0,sizeof(fiu));
}
};
Trie *T = new Trie;
char s[30];
void adauga(Trie *nod,char *s)
{
if(*s==0)
{
nod->nr_cuv++; return;
}
if(nod->fiu[ch]==NULL)
{
nod->fiu[ch]= new Trie;
nod->nr_fii++;
}
adauga(nod->fiu[ch],s+1);
}
bool sterge(Trie *nod,char *s)
{
if(*s==0) nod->nr_cuv--;
else
if(sterge(nod->fiu[ch],s+1)==1)
{
nod->fiu[ch]=0;
nod->nr_fii--;
}
if(nod->nr_fii==0 && nod->nr_cuv==0 && nod!=T)
{
delete nod;
return 1;
}
return 0;
}
int aparitii(Trie *nod, char *s)
{
if(*s==0)
return nod->nr_cuv;
if(nod->fiu[ch]!=0)
return aparitii(nod->fiu[ch],s+1);
return 0;
}
int prefix(Trie *nod,char *s,int k)
{
if(*s==0 || nod->fiu[ch]==0)
return k;
return prefix(nod->fiu[ch],s+1,k+1);
}
int main()
{
while(fi.getline(s,30))
{
if(s[0]=='0')adauga(T,s+2);
if(s[0]=='1')sterge(T,s+2);
if(s[0]=='2')fo<<aparitii(T,s+2)<<"\n";
if(s[0]=='3')fo<<prefix(T,s+2,0)<<"\n";
}
return 0;
}
//#include <fstream> // |^
//#include <cstring>
//#define ch (*s-'a')
//using namespace std;
//ifstream fi("trie.in");
//ofstream fo("trie.out");
//struct Trie{
// int nr_fii; //cate cuvinte merg in continuare din nod(numarul de fii)
// int nr_cuv; //numar cuvinte care se termina in nod
// Trie *fiu[26]; //deoarece alfabetul este de 26 litere, putem avea maxim 26 fii dintru-un nod
// Trie()
// {
// nr_fii=nr_cuv=0; //se pune pe 0
// memset(fiu,0,sizeof(fiu)); //se pun toti fii pe 0
// }
//
//};
//Trie *T = new Trie; //creare nod radacina
//char s[30];
//void adauga(Trie *nod,char *s){ //adauga cuvintul( indicat de pointerul s) in trie
// if(*s==0) //s-a terminat cuvantul
// {
// nod->nr_cuv++; return; //cresc numar de cuvinte ce se termina in nod
// }
// if(nod->fiu[ch]==NULL) //sunt in cuvant si ajung pe trie la un nod ce nu are folosita litera curenta din cuvant(s)
// {
// nod->fiu[ch]= new Trie; //fac o noua trie
// nod->nr_fii++; //cresc fii nodului curent
// }
// adauga(nod->fiu[ch],s+1); //merg la urmatoarea litera in cuvantul curent
//}
//bool sterge(Trie *nod,char *s){
// if(*s==0) nod->nr_cuv--;
// else
// if(sterge(nod->fiu[ch],s+1)==1)
// {
// nod->fiu[ch]=0;
// nod->nr_fii--;
// }
// if(nod->nr_fii==0 && nod->nr_cuv==0 && nod!=T)
// {
// delete nod;
// return 1;
// }
// return 0;
//}
//int aparitii(Trie *nod, char *s){
// if(*s==0)
// return nod->nr_cuv;
// if(nod->fiu[ch]!=0)
// return aparitii(nod->fiu[ch],s+1);
// return 0;
//}
//int prefix(Trie *nod,char *s,int k){
// if(*s==0 || nod->fiu[ch]==0)
// return k;
// return prefix(nod->fiu[ch],s+1,k+1);
//}
//int main(){
// while(fi.getline(s,30))
// {
// if(s[0]=='0')adauga(T,s+2);
// if(s[0]=='1')sterge(T,s+2);
// if(s[0]=='2')fo<<aparitii(T,s+2)<<"\n";
// if(s[0]=='3')fo<<prefix(T,s+2,0)<<"\n";
// }
// return 0;
//}
//