Cod sursa(job #1653985)

Utilizator leopop29Pop Leonard leopop29 Data 16 martie 2016 19:01:37
Problema Trie Scor 65
Compilator cpp Status done
Runda Arhiva educationala Marime 1.63 kb
#include <fstream>
#include <cstring>
#include <stdlib.h>

using namespace std;

struct tr{
    int trm, ct;
    tr* nxt[26];
    tr(){
        trm = 0;
        ct = 0;
        memset(nxt, 0, sizeof(nxt));
    }
};

string s;
tr* r = new tr();
ifstream f("trie.in");
ofstream cout("trie.out");

void ins(tr* n, unsigned int p)
{
    if(p == s.size())
    {
        ++n->trm;
        return;
    }
    ++n->ct;

    int d = s[p]-'a';
    if(n->nxt[d] == NULL)
        n->nxt[d] = new tr;
    ins(n->nxt[d], p+1);
}

int rm(tr* n, unsigned int p)
{
    int d = s[p]-'a';

    if(p == s.size())
        --n->trm;

    else if(rm(n->nxt[d], p+1))
    {
        --n->ct;
        n->nxt[d] = NULL;
    }
    if(!n->ct && !n->trm && n != r)
    {
        free(n);
        return 1;
    }
    return 0;
}

void nr(tr* n, unsigned int p)
{
    if(p == s.size())
    {
        cout << n->trm << '\n';
        return;
    }

    int d = s[p]-'a';
    if(n->nxt[d] == NULL)
    {
        cout << 0 << '\n';
        return;
    }

    nr(n->nxt[d], p+1);
}

void lgst_pr(tr* n, unsigned int p)
{
    int d = s[p]-'a';
    if(!&n->nxt[d] || n->nxt[d] == NULL || p == s.size())
    {
        cout << p << '\n';
        return;
    }
    lgst_pr(n->nxt[d], p+1);
}

int main()
{
    int t;
    f >> t;
    while(!f.eof())
    {
        f >> s;
        switch(t)
        {
            case 0: {ins(r, 0); break;}
            case 1: {rm(r, 0); break;}
            case 2: {nr(r, 0); break;}
            case 3: {lgst_pr(r, 0); break;}
        }
        f >> t;
    }
    return 0;
}