Cod sursa(job #3255250)

Utilizator CatalinPangaleanuCatalin Pangaleanu CatalinPangaleanu Data 9 noiembrie 2024 20:04:52
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.92 kb
#include <iostream>
#include <fstream>

using namespace std;

struct TrieNode
{
    TrieNode* alphabet[26]={};
    int cnt=0, children=0;
};

TrieNode *head=new TrieNode;

void insert(TrieNode *currNode, const string& word, int index)
{
    if (index==word.length())
    {
        ++currNode->cnt;
        return;
    }
    ++currNode->children;
    if (currNode->alphabet[word[index]-'a']==nullptr)
        currNode->alphabet[word[index]-'a']=new TrieNode;
    insert(currNode->alphabet[word[index]-'a'], word, index+1);
}

bool remove(TrieNode *currNode, const string& word, int index)
{
    if (index==word.length())
        --currNode->cnt;
    else
    {
        --currNode->children;
        if (remove(currNode->alphabet[word[index] - 'a'], word, index + 1))
            currNode->alphabet[word[index] - 'a'] = nullptr;
    }
    if (currNode->children==0 && currNode->cnt==0 && currNode!=head)
    {
        delete currNode;
        return true;
    }
    return false;
}

int frequency(TrieNode *currNode, const string& word, int index)
{
    if (index==word.length())
        return currNode->cnt;
    if (currNode->alphabet[word[index]-'a']==nullptr)
        return 0;
    return frequency(currNode->alphabet[word[index]-'a'], word, index+1);
}

int longestPrefix(TrieNode *currNode, const string& word, int index)
{
    if (index==word.length())
    {
            return index;
    }
    if (currNode->alphabet[word[index]-'a']==nullptr)
        return index;
    return longestPrefix(currNode->alphabet[word[index]-'a'], word, index+1);
}

int main()
{
    ifstream fin("trie.in");
    ofstream fout("trie.out");
    int op;
    string word;
    while (fin>>op>>word)
    {
        if (op==0)
            insert(head, word, 0);
        else if (op==1)
            remove(head, word, 0);
        else if (op==2)
            fout<<frequency(head, word, 0)<<'\n';
        else
            fout<<longestPrefix(head, word, 0)<<'\n';
    }

    return 0;
}