Cod sursa(job #2200410)

Utilizator FunnyStockyMihnea Andreescu FunnyStocky Data 1 mai 2018 12:14:39
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 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 k)
{
    int val=*s-'a';
    if(int(*s)==0 || nod->fiu[val]==0)
        return k;
    return prefix(nod->fiu[val],s+1,k+1);
}

int main()
{
    char s[100];
    while(fin.getline(s,100))
    {
        if(s[0]=='0')Insert(T,s+2);
        if(s[0]=='1')Delete(T,s+2);
        if(s[0]=='2')fout<<slove(T,s+2)<<"\n";
        if(s[0]=='3')fout<<prefix(T,s+2,0)<<"\n";
    }
    return 0;
}
/**



**/