Cod sursa(job #2696043)

Utilizator bogosanuAndrei Bogos bogosanu Data 15 ianuarie 2021 08:30:00
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.26 kb
#include <bits/stdc++.h>
#define Q ( S[i] - 'a' )

using namespace std;

ifstream fin("trie.in");
ofstream fout("trie.out");



struct Trie
{int end, son;
 Trie *F[26];
 Trie()
     {end=son=0;
      memset(F,0,sizeof(F));
     }
};

Trie *T = new Trie;
string S;


void add(Trie *nod, unsigned int i)
{if(i==S.length())
   {nod->end++; return;}
 if(nod->F[Q]==0)
   {nod->F[Q]= new Trie;
    nod->son++;
   }
 add(nod->F[Q], i+1);
}

int del(Trie *nod, unsigned int i)
{if(i==S.length()) nod->end--;
 else if(del(nod->F[Q],i+1))
        {nod->F[Q] = 0;
         nod->son--;
        }
 if(nod->end==0 && nod->son==0 && nod!=T)
   {delete nod; return 1;}
 return 0;
}

int query(Trie *nod, unsigned int i)
{if(i==S.length())
    return nod->end;
 if(nod->F[Q]) return query(nod->F[Q],i+1);
 return 0;
}
int prefix(Trie *nod, unsigned int i, int k)
{if(i==S.length() || nod->F[Q]==0)
    return k;
 return prefix(nod->F[Q],i+1,k+1);
}

int main()
{int q;
 while(fin>>q)
      {fin>>S;
       switch(q)
             {case 0: add(T,0); break;
              case 1: del(T,0); break;
              case 2: fout<<query(T,0)<<'\n'; break;
              case 3: fout<<prefix(T,0,0)<<'\n'; break;
             }
       }

return 0;
}