Cod sursa(job #1328158)

Utilizator SpiriFlaviuBerbecariu Flaviu SpiriFlaviu Data 28 ianuarie 2015 02:13:11
Problema Trie Scor 55
Compilator cpp Status done
Runda Arhiva educationala Marime 2.09 kb
#include <fstream>
#include <string>

using namespace std;

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

struct Node
{
    int N;
    int nr;
    Node* sons[27];
    Node()
    {
        N = 0;
        for(int i =0;i<=26;i++)
            sons[i] = NULL;
        nr = 0;
    }
    ~Node()
    {
        nr = 0;
        N = 0;
        for(int i =0;i<=26;i++)
            delete sons[i];
    }
} ;

void update(string s, int pos, Node * x)
{
    if(pos == s.length())
    {
        x->N  ++;
        return;
    }

    if(x->sons[s[pos]-'a'] != NULL)
    {
        update(s, pos+1, x->sons[s[pos]-'a']);
        return;
    }
    x->nr ++;
    x->sons[s[pos]-'a'] = new Node();
    update(s, pos+1, x->sons[s[pos]-'a']);
}

bool del(string s, int pos, Node *x)
{
    if(pos == s.length())
    {
        if(x->N == 1 && x->nr == 0)
        {
            delete x;
            return true;
        }
        else x->N--;
        return false;

    }
    if(x->sons[s[pos]-'a'] == NULL)
        return false;
    bool res = del(s, pos+1, x->sons[s[pos]-'a']);
    if(res)
    {
        x->sons[s[pos]-'a'] = NULL;
        if(x->nr==1)
        {
            delete x;
            return true;
        }
        return false;

    }
    return false;
}

int queryAp(string s, int pos, Node* x)
{
    if(pos == s.length())
        return x->N;
    if(x->sons[s[pos]-'a'] == NULL)
        return 0;
    return queryAp(s, pos+1, x->sons[s[pos]-'a']);
}

int queryCMLP(string s, int pos, Node* x)
{
    if(pos == s.length())
        return 0;
    if(x->sons[s[pos]-'a']!=NULL)
        return 1 + queryCMLP(s, pos+1, x->sons[s[pos]-'a']);
    return 0;
}

int main()
{
    int op;
    string s;
    Node * T =new Node();
    while(fin>>op)
    {
        fin>>s;
        if(op == 0)
            update(s,0,T);
        else if(op == 1)
            del(s,0,T);
        else if(op == 2)
            fout<<queryAp(s,0,T)<<'\n';
        else fout<<queryCMLP(s,0,T)<<'\n';
    }



    fin.close();
    fout.close();
    return 0;
}