Cod sursa(job #2202510)

Utilizator rnqftwcalina florin daniel rnqftw Data 8 mai 2018 22:12:57
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.65 kb
#include <cstring>
#include <fstream>
#include <iostream>

using namespace std;

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

struct Trie
{
    int cnt,nr_fii;
    Trie *fiu[26];
    Trie()
    {
        cnt=nr_fii=0;
        for(int i=0;i<26;i++)
            fiu[i]=0;
    }
};

Trie *T=new Trie;

void Insert(Trie *nod,char *s)
{
    if(int(*s)==0)
    {
        nod->cnt++;
        return;
    }
    int val=*s-'a';
    if(nod->fiu[val]==0)
    {
        nod->fiu[val]=new Trie;
        nod->nr_fii++;
    }
    Insert(nod->fiu[val],s+1);
}

int Delete(Trie *nod,char *s)
{
    int val=*s-'a';
    if(int(*s)==0)
        nod->cnt--;
    else
        if(Delete(nod->fiu[val],s+1)==1)
        {
            nod->fiu[val]=0;
            nod->nr_fii--;
        }
    if(nod->cnt==0 && nod->nr_fii==0 && nod!=T)
    {
        delete nod;
        return 1;
    }
    return 0;
}

int slove(Trie *nod,char *s)
{
    if(int(*s)==0)
        return nod->cnt;
    int val=*s-'a';
    if(nod->fiu[val])
        return slove(nod->fiu[val],s+1);
    return 0;
}

int prefix(Trie *nod,char *s)
{
    int val=*s-'a';
    if(int(*s)==0 || nod->fiu[val]==0)
        return 0;
    return 1+prefix(nod->fiu[val],s+1);
}

int main(){
    int tip;
    char s[20];
    while(fin>>tip>>s){
        switch(tip){
             case 0: Insert(T,s);
                    break;
             case 1: Delete(T,s);
                    break;
             case 2:fout<<slove(T,s)<<'\n';
                    break;
             case 3:fout<<prefix(T,s)<<'\n';
                    break;

        }
    }


    return 0;
}