Cod sursa(job #1184772)

Utilizator buzu.tudor67Tudor Buzu buzu.tudor67 Data 14 mai 2014 01:06:03
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.84 kb
#include<fstream>
#include<string>
using namespace std;
ifstream fi("trie.in");
ofstream fo("trie.out");

const int sigma = 26;

struct TRIE{
       int aparitii;
       int nr_fii;
       TRIE *fiu[sigma];
       TRIE(){
              aparitii=0;
              nr_fii=0;
              for(int i=0;i<sigma;i++) fiu[i]=NULL;
             };
};

TRIE *root = new TRIE;
string s;
int oper;

void insert_TRIE(TRIE *nod,int poz){
     int c = s[poz]-'a';
     
     if(s[poz]=='\0') nod->aparitii++;
     else{
          if(nod->fiu[c]==NULL){ nod->fiu[c]=new TRIE; nod->nr_fii++; }
          
          insert_TRIE(nod->fiu[c],poz+1);
         }
}

bool delete_TRIE(TRIE *nod,int poz){
     int c = s[poz]-'a';
     
     if(s[poz]=='\0') nod->aparitii--;
     else if(delete_TRIE(nod->fiu[c],poz+1)){
                                             nod->fiu[c]=NULL;
                                             nod->nr_fii--;
                                            }
     
     if(nod->aparitii==0 && nod->nr_fii==0 && nod!=root){ delete nod; return 1; } 
     return 0;
}    

int query_TRIE(TRIE *nod,int poz){
    int c = s[poz]-'a'; 
    
    if(s[poz]=='\0') return nod->aparitii;
    if(nod->fiu[c]==NULL) return 0;
    
    return query_TRIE(nod->fiu[c],poz+1);
}

int prefix_TRIE(TRIE *nod,int poz){
    int c = s[poz]-'a';
    
    if(s[poz]=='\0' || nod->fiu[c]==NULL) return poz;
    return prefix_TRIE(nod->fiu[c],poz+1);
}

int main(){
    
    while(fi>>oper>>s){
                       if(oper==0) insert_TRIE(root,0);
                       else if(oper==1) delete_TRIE(root,0);
                       else if(oper==2) fo<<query_TRIE(root,0)<<"\n";
                       else if(oper==3) fo<<prefix_TRIE(root,0)<<"\n";
                      }
    
    fi.close();
    fo.close();
    return 0;
}