Pagini recente » Cod sursa (job #2387666) | Cod sursa (job #2870138) | Cod sursa (job #813848) | Cod sursa (job #734221) | Cod sursa (job #1167176)
#include <iostream>
#include <cstring>
#include <fstream>
using namespace std;
//26 de litere mici.adica 26 de fii
class Nod{
public:
int End;
Nod *Fiu[26];
int Nr_Fii;
Nod(){
Nr_Fii=0;
End=0;
memset(Fiu,0,sizeof(Fiu));
}
};
class Trie{
private:
Nod *Head;
protected:
void Inserare(Nod *nod,char *s);
int Find(Nod *nod,char *s);
int Sterge(Nod *nod,char *s);
int Prefix(Nod *nod,char *s,int lg);
public:
Trie(){
Head=new Nod;
}
void Inserare(char *s);
void Find(char *s);
void Sterge(char *s);
void Prefix(char *s);
};
void Trie::Inserare(char *s){
Inserare(Head,s);
}
void Trie::Inserare(Nod *nod,char *s){
if(s[0]==0){
nod->End++;
}
else{
if(nod->Fiu[s[0]-'a']==NULL){
nod->Fiu[s[0]-'a']=new Nod;
nod->Nr_Fii++;
}
Inserare(nod->Fiu[s[0]-'a'],s+1);
}
}
void Trie::Sterge(char *s){
Sterge(Head,s);
}
int Trie::Sterge(Nod *nod,char *s){
if(s[0]==0){
nod->End--;
}
else
if(Sterge(nod->Fiu[s[0]-'a'],s+1)){
nod->Nr_Fii--;
nod->Fiu[s[0]-'a']=0;
}
if(nod->End==0 && nod->Nr_Fii==0 && nod!=Head){
delete nod;
return 1;
}
return 0;
}
void Trie::Find(char *s){
Find(Head,s);
}
int Trie::Find(Nod *nod,char *s){
if(s[0]==0){
return nod->End;
}
if(nod->Fiu[s[0]-'a']!=NULL)
Find(nod->Fiu[s[0]-'a'],s+1);
else
return 0;
}
void Trie::Prefix(char *s){
Prefix(Head,s,0);
}
int Trie::Prefix(Nod *nod,char *s,int lg){
if(s[0]==0 || nod->Fiu[s[0]-'a']==0)
return lg;
return Prefix(nod->Fiu[s[0]-'a'],s+1,lg+1);
}
int main(){
Trie A;
int x;
char s[45];
ifstream f("trie.in");
ofstream g("trie.out");
f>>x;
while(!f.eof()){
if(f.eof()) break;
if(x==0){
memset(s,0,sizeof(s));
f>>s;
A.Inserare(s);
}
else if(x==2){
memset(s,0,sizeof(s));
f>>s;
g<<A.Find(s)<<endl;
}
else if(x==1){
memset(s,0,sizeof(s));
f>>s;
A.Sterge(s);
}
else {
memset(s,0,sizeof(s));
f>>s;
g<<A.Prefix(s)<<endl;
}
f>>x;
}
f.close();
g.close();
return 0;
}