Cod sursa(job #769633)

Utilizator ion824Ion Ureche ion824 Data 20 iulie 2012 12:09:54
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.68 kb
#include<fstream>
#include<string>
#include<cstring>
using namespace std;

struct trie{
       struct trie *f[26];
       int nr,cuv;
       trie(){nr=cuv=0;
           memset(f,0,sizeof(f));}
       }*t;  
string s;

void add(){
     trie *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 trie;
       g=g->f[urm];
       g->nr++;
       ++i;                
     }
     ++g->cuv;    
}

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

int aparitii(){
     trie *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(){
     trie *g=t;
     int l=0,i=0,urm;
     while((s[i])>='a' && (s[i])<='z') 
     {
        urm = s[i] - 'a';
        if(g->f[urm]==0)return l;
        g=g->f[urm];
        if(g->nr==0)return l;
        ++i;
        ++l;           
     }  
    return l;    
}

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