Cod sursa(job #1909368)

Utilizator ciocan_catalinCiocan Catalin - Iulian ciocan_catalin Data 7 martie 2017 12:29:53
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include <bits/stdc++.h>
#define ch (*s-'a')
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
char s[30];

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

Trie *T = new Trie;

inline void Add(Trie *nod, char *s)
{
    if(*s == 0)
    {
        nod->nr_cuv++;
        return;
    }
    if(nod -> fiu[ch] == 0)
    {
        nod -> fiu[ch] = new Trie;
        nod -> nr_fii++;
    }
    Add(nod -> fiu[ch],s+1);
}

inline bool Delete(Trie *nod, char *s)
{
    if(*s == 0) nod -> nr_cuv--;
    else
    {
        if(Delete(nod -> fiu[ch], s+1))
        {
            nod -> fiu[ch] = 0;
            nod -> nr_fii--;
        }
    }
    if(nod -> nr_fii == 0 && nod -> nr_cuv == 0 && nod != T)
    {
        delete nod;
        return true;
    }
    return false;
}

inline int Query(Trie *nod, char *s)
{
    if(*s == 0) return nod -> nr_cuv;
    return Query(nod -> fiu[ch],s+1);
}

inline int Prefix(Trie *nod, char *s, int len)
{
    if(*s == 0 || nod -> fiu[ch] == 0) return len;
    return Prefix(nod -> fiu[ch],s+1,len+1);
}

int main()
{
    int tip;
    while(fin >> tip >> s)
    {
        if(!tip) Add(T,s);
        if(tip == 1) Delete(T,s);
        if(tip == 2) fout << Query(T,s) << "\n";
        if(tip == 3) fout << Prefix(T,s,0) << "\n";
    }
    fout.close();
    return 0;
}