Cod sursa(job #759394)

Utilizator ion824Ion Ureche ion824 Data 17 iunie 2012 21:21:22
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.57 kb
#include<fstream>
#include<string>
using namespace std;

struct nod{
       struct nod*f[26];
       int viz,cuv;
       }*t;
       
string s;

void add(){
     nod *g=t;
     int urm,i=0;
     while((s[i])>='a' && (s[i])<='z')
     {
       urm = s[i] - 'a';
       if(g->f[urm]==0)g->f[urm]=new nod;
       g=g->f[urm];
       g->viz++;
       ++i;                
     }
     g->cuv++;    
}

void remove(){
     nod *g=t;
     int urm,i=0;
     while((s[i])>='a' && (s[i])<='z')
     {
      urm = s[i] - 'a';
      g=g->f[urm];
      g->viz--;
      ++i;                
     }
     g->cuv--;     
}

int aparitii(){
     nod *g=t;
     int i=0,urm;
     while((s[i])>='a' && (s[i])<='z') 
     {
      urm = s[i] - 'a';
      if(g->f[urm]==0)return 0;
      g=g->f[urm];
      ++i;               
     } 
     return g->cuv;
}

int prefix(){
     nod *g=t;
     int l=0,p=0,i=0,urm;
     while((s[i])>='a' && (s[i])<='z') 
     {
        urm = s[i] - 'a';
        if(g->f[urm]==0)break;
        g=g->f[urm];
        ++i;
        ++p;
        if(g->viz>0)l=p;             
     }  
    return l;    
}

int main(void){
    ifstream fin("trie.in");
    ofstream fout("trie.out");
    int c;
    t=new nod;
    do{     
        s.clear();   
        fin>>c>>s;
        switch(c){
             case 0: add(); break;
             case 1: remove(); break;
             case 2: fout<<aparitii()<<'\n';
             case 3: fout<<prefix()<<'\n';              
                  }         
       }while(s!="");
 return 0;   
}