Cod sursa(job #2331818)

Utilizator AndreiDeltaBalanici Andrei Daniel AndreiDelta Data 29 ianuarie 2019 22:44:56
Problema Trie Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.64 kb
#include <bits/stdc++.h>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
int type;
char word[30];

struct Trie
{
    int cnt,nrfii;
    Trie* Edges[26];
    Trie()
    {
       nrfii=cnt=0;
       memset(Edges,0,sizeof(Edges));
    }
};

Trie* T=new Trie;

void Insert(Trie *nod,int lit,int lg)
{
    if(lit==lg)
    {
        nod->cnt++;
        return;
    }

    if(nod->Edges[word[lit]-'a']==0)
    {
        nod->Edges[word[lit]-'a']=new Trie;
        nod->nrfii++;
    }
    Insert(nod->Edges[word[lit]-'a'],lit+1,lg);
}

bool Delete(Trie *nod,int lit,int lg)
{
    if(lit==lg)
        nod->cnt--;
    else
    if(Delete(nod->Edges[word[lit]-'a'],lit+1,lg))
    {
        nod->nrfii--;
        nod->Edges[word[lit]-'a']=0;
    }

    if(nod!=T&&nod->nrfii==0&&nod->cnt==0)
    {
        delete nod;
        return 1;
    }
    return 0;
}

int NRWORDS(Trie *nod,int lit,int lg)
{
    if(lit==lg) return nod->cnt;
    if(nod->Edges[word[lit]-'a'])
        return NRWORDS(nod->Edges[word[lit]-'a'],lit+1,lg);
    return 0;
}

int prefix(Trie *nod,int lit,int ans,int lg)
{
    if(lit==lg||nod->Edges[word[lit]-'a']==0)
        return ans;

    if(nod->Edges[word[lit]-'a'])
        return prefix(nod->Edges[word[lit]-'a'],lit+1,ans+1,lg);

}

int main()
{
   while(f>>type)
   {

       f>>word;
       if(type==0) Insert(T,0,strlen(word));
       else
       if(type==1) Delete(T,0,strlen(word));
       else
       if(type==2) g<<NRWORDS(T,0,strlen(word))<<'\n';
       else
       if(type==3)
       g<<prefix(T,0,0,strlen(word))<<'\n';
   }
    return 0;
}