Cod sursa(job #1764605)

Utilizator Dan_RadulescuRadulescu Dan Dan_Radulescu Data 25 septembrie 2016 18:10:02
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.63 kb
#include<fstream>
#include<string.h>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
int n,i;
char s[255];
struct trie{
   int nr,pref;
   trie *urm[27];
}*nod;
void insereaza(){
    int i,l,j,k;
    trie *q,*w;
    l=strlen(s);
    q=nod;
    for (i=0;i<l;i++){
        j=s[i]-'a';
        if (q->urm[j]!=0) {
            q=q->urm[j];
            q->pref++;
        }
          else{
            w=new trie;
            w->nr=0;w->pref=1;
            for (k=0;k<=25;k++)
                w->urm[k]=0;
            q->urm[j]=w;
            q=w;
          }
    }
    q->nr++;
    q->pref++;
}
void sterge(){
    int i,l,j,k;
    trie *q;
    q=nod;
    l=strlen(s);
    for (i=0;i<l;i++){
        j=s[i]-'a';
        q=q->urm[j];
        q->pref--;
    }
    q->nr--;
    q->pref--;
}
int nrap(){
    int i,l,j,k;
    trie *q;
    q=nod;
    l=strlen(s);
    for (i=0;i<l;i++){
        j=s[i]-'a';
        if (q->urm[j]==0){
            return 0;
        }
        q=q->urm[j];
    }
    return q->nr;
}
int prefix(){
    int i,l,j,val;
    val=0;
    trie *q;
    q=nod;
    for (i=0;i<l;i++){
        j=s[i]-'a';
        if (q->urm[j]==0) return val;
        val++;
        q=q->urm[j];
        if (q->pref==0) return val-1;
    }
    return val;
}
int main(){
   nod=new trie;
   nod->nr=0;nod->pref=0;
   for (i=0;i<=25;i++)
        nod->urm[i]=0;
   while(fin>>n>>s){
      if (n==0) insereaza();
      if (n==1) sterge();
      if (n==2) fout<<nrap()<<'\n';
      if (n==3) fout<<prefix()<<'\n';
   }
   fin.close();
   fout.close();
   return 0;
}