Pagini recente » Istoria paginii utilizator/danilodjokic997 | Istoria paginii runda/oni_2009_1_10 | Istoria paginii runda/sim_ix_21_01_2021/clasament | Istoria paginii runda/avram_iancu_10 | Cod sursa (job #3136366)
#include <bits/stdc++.h>
using namespace std;
/// Nod
class Nod
{
public:
int fr,cuv;
Nod *leg[26];
Nod(){
fr=0;
cuv=1;
for(int i=0;i<=25;i++)
leg[i] = NULL;
}
Nod(int frq){
fr=frq;
cuv=1;
for(int i=0;i<=25;i++)
leg[i] = NULL;
}
Nod(int frq,int nr){
fr=frq;
cuv=nr;
for(int i=0;i<=25;i++)
leg[i] = NULL;
}
};
class Trie
{
private:
int tot;
public:
Nod *rad;
///Contructor 1
Trie(){
rad=new Nod(0,0);
tot=0;
}
///Contructor 2
Trie(string s){
rad=new Nod(0,0);
tot=0;
Add(s);
}
/// Adauga un cuvant
virtual void Add(string s){
tot++;
int x;
Nod *p = rad,*q;
for(unsigned int i=0;i<s.size();i++){
x=s[i]-'a';
if(p->leg[x]!=NULL){
p=p->leg[x];
p->cuv++;
}
/// Creaza un nou nod
else{
q=new Nod();
p->leg[x]=q;
p=q;
}
}
p->fr++;
}
/// Sterge un cuvant
virtual void Delete(string s){
tot--;
int x;
Nod*p = rad;
for(unsigned int i=0;i<s.size();i++){
x=s[i]-'a';
p=p->leg[x];
p->cuv--;
}
p->fr--;
}
/// returneaza de cate ori apare un cuvant
virtual int Freq(string s){
int x;
Nod*p = rad;
for(unsigned int i=0;i<s.size();i++){
x=s[i]-'a';
/// nu exista cuvantul
if(p->leg[x]==NULL) return 0;
p=p->leg[x];
}
return p->fr;
}
/// Cate cuvinte sunt in trie
int Size(){
return tot;
}
/// Adauga un cuvant
void operator+=(string s){
Add(s);
}
/// Sterge un cuvant
void operator-=(string s){
Delete(s);
}
/// verifica daca au acelasi numar de cuvinte
friend bool operator==(Trie& A,Trie& B){
return A.Size()==B.Size();
}
/// verifica daca are mai multe sau acelasi numar de cuvinte
friend bool operator>=(Trie& A,Trie& B){
return A.Size()>=B.Size();
}
/// verifica daca are mai putine sau acelasi numar de cuvinte
friend bool operator<=(Trie& A,Trie& B){
return A.Size()<=B.Size();
}
/// verifica daca au numar diferit de cuvinte
friend bool operator!=(Trie& A,Trie& B){
return A.Size()!=B.Size();
}
/// returneaza care are mai multe cuvinte
friend bool operator<(Trie& A,Trie& B){
return A.Size()<B.Size();
}
/// returneaza care are mai putine cuvinte
friend bool operator>(Trie& A,Trie& B){
return A.Size()>B.Size();
}
};
class IATrie : public Trie
{
public:
IATrie() : Trie(){};
IATrie(string _s) : Trie(_s){};
/// returneaza lungimea celui mai lung prefix comun al lui s cu oricare cuvant din lista
int Comun(string s){
int x,ml=0;
Nod*p = rad;
for(unsigned int i=0;i<s.size();i++){
x=s[i]-'a';
if(p->leg[x]==NULL) return ml;
p=p->leg[x];
if(p->cuv==0) return ml;
ml++;
}
return ml;
}
};
ifstream fin("trie.in");
ofstream fout("trie.out");
int main()
{
string s;
int c;
IATrie rad;
while(fin >> c >> s){
if(c==0) rad.Add(s);
else if(c==1) rad.Delete(s);
else if(c==2) fout << rad.Freq(s)<< "\n";
else fout << rad.Comun(s) << "\n";
}
return 0;
}