Cod sursa(job #2504759)

Utilizator DordeDorde Matei Dorde Data 5 decembrie 2019 15:50:03
Problema Trie Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.75 kb
#include <fstream>
#include <cstring>
#include <algorithm>
using namespace std;
ifstream f ("trie.in");
ofstream g ("trie.out");
struct Trie {
    int endw , cntfii;
    Trie *fii [26];
    Trie (){
        endw = cntfii = 0;
        memset (fii , 0 , sizeof (fii));
    }
};
Trie *start = new Trie;
char s [100];
void add (Trie *node , char *p){
    char o = *p - 'a';
    if (! isalpha (*p)){
        ++ node -> endw;
        return;
    }
    if (! node -> fii [o])
        node -> fii [o] = new Trie , ++ node -> cntfii;
    add (node -> fii [o] , p + 1);
}
int isw (Trie *node , char *p){
    char o = *p - 'a';
    if (! isalpha (*p))
        return node -> endw;
    if (! node -> fii [o])
        return 0;
    isw (node -> fii [o] , p + 1);
}
int lprf (Trie *node , char *p , int lmax){
    if (! isalpha (*p) || ! node -> fii [*p - 'a'])
        return lmax;
    return lprf (node -> fii [*p - 'a'] , p + 1 , lmax + 1);
}
void del (Trie *node , char *p , Trie *tata){
    if (! isalpha (*p)){
        -- node -> endw;
        if (! node -> endw && ! node -> cntfii){
            -- tata -> cntfii;
            tata -> fii [* (p - 1) - 'a'] = NULL;
            delete node;
        }
        return;
    }
    del (node -> fii [*p - 'a'] , p + 1 , node);
    if (! node -> endw && ! node -> cntfii){
        -- tata -> cntfii;
        tata -> fii [* (p - 1) - 'a'] = NULL;
        delete node;
    }
}
int main()
{
    int c;
    while (f >> c >> s){
        if (c == 0)
            add (start , s);
        if (c == 2)
            g << isw (start , s) << '\n';
        if (c == 1)
            del (start , s , start);
        if (c == 3)
            g << lprf (start , s , 0) << '\n';
    }
    return 0;
}