Cod sursa(job #2458448)

Utilizator popabogdanPopa Bogdan Ioan popabogdan Data 20 septembrie 2019 16:58:25
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.15 kb
#include <bits/stdc++.h>

using namespace std;

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

struct trieNode
{
    int cntEnd;
    int cnt;
    trieNode *nxt[26];
    trieNode()
    {
        cntEnd = 0;
        cnt = 0;
        for(int i = 0; i < 26; i++)
            nxt[i] = NULL;
    }
};

trieNode *root;
int t;
string S;

void insert(string S)
{
    trieNode *currNode = root;
    for(int i = 0; i < S.size(); i++)
    {
        if(currNode -> nxt[S[i] - 'a'] == NULL)
            currNode -> nxt[S[i] - 'a'] = new trieNode;
        currNode = currNode -> nxt[S[i] - 'a'];
        currNode -> cnt++;
    }
    currNode -> cntEnd++;
}

void dilit(string &S, int idx, trieNode *currNode)
{
    if(idx == S.size())
    {
        currNode -> cntEnd--;
        return;
    }
    dilit(S, idx + 1, currNode -> nxt[S[idx] - 'a']);
    currNode -> nxt[S[idx] - 'a'] -> cnt--;
    if(currNode -> nxt[S[idx] - 'a'] -> cnt == 0)
    {
        delete currNode -> nxt[S[idx] - 'a'];
        currNode -> nxt[S[idx] - 'a'] = NULL;
    }
}

int getCntEnd(string S)
{
    trieNode *currNode = root;
    for(int i = 0; i < S.size(); i++)
    {
        if(currNode -> nxt[S[i] - 'a'] == NULL)
            return 0;
        currNode = currNode -> nxt[S[i] - 'a'];
    }
    return currNode -> cntEnd;
}

int lgPf(string S)
{
    trieNode *currNode = root;
    for(int i = 0; i < S.size(); i++)
    {
        if(currNode -> nxt[S[i] - 'a'] == NULL)
            return i;
        currNode = currNode -> nxt[S[i] - 'a'];
    }
    return S.size();
}

int main()
{
    root = new trieNode;
    while(fin >> t >> S)
    {
        switch(t)
        {
        case 0:
            {
                insert(S);
                break;
            }
        case 1:
            {
                dilit(S, 0, root);
                break;
            }
        case 2:
            {
                fout << getCntEnd(S) << "\n";
                break;
            }
        case 3:
            {
                fout << lgPf(S) << "\n";
                break;
            }

        }
    }
    return 0;
}