Cod sursa(job #1737826)

Utilizator danutbodbodnariuc danut danutbod Data 4 august 2016 23:07:43
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 3.62 kb
#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;
//}
//