Cod sursa(job #2940985)

Utilizator BuzatuCalinBuzatu Calin BuzatuCalin Data 16 noiembrie 2022 21:12:24
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.43 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct Trie
{
    int endOfWord, cai;
    struct Trie* child[29];
};
Trie *createNewNode()
{
    Trie *node = new Trie;
    node -> endOfWord = 0;
    node -> cai = 0;
    for (int i = 0; i < 26; i++)
    {
        node -> child[i] = 0;
    }
    return node;
}
void insert(Trie* root, string s)
{
    Trie* curr = root;

    for (int i = 0; i < s.length(); i++)
    {
        int ind = s[i] - 'a';
        if (curr -> child[ind] == 0)
        {
            curr -> child[ind] = createNewNode();
        }
        curr = curr->child[ind];
        curr -> cai++;
    }
    curr -> endOfWord++;
}
int search(Trie* root, string s)
{
    Trie *curr = root;
    for (int i = 0; i < s.length(); i++)
    {
        int ind = s[i] - 'a';
        if (!curr -> child[ind])
        {
            return 0;
        }
        curr = curr -> child[ind];
    }
    return curr -> endOfWord;
}
int longest_prefix(Trie *root, string s)
{
    Trie *curr = root;
    int maxim = 0;
    for (int i = 0; i < s.length(); i++)
    {
        int ind = s[i] - 'a';
        if (curr -> child[ind] == 0)
        {
            if (curr -> cai > 0)
            {
                return i;
            }
            else
            {
                return maxim;
            }
        }
        
        curr = curr -> child[ind];
        if (curr -> cai > 0)
        {
            maxim = i + 1;
        }
        else
        {
            return maxim;
        }
    }
    return maxim;
}
void delete_node(Trie *root, string s)
{
    Trie *curr = root;
    for (int i = 0; i < s.length(); i++)
    {
        int ind = s[i] - 'a';
        if (!curr -> child[ind])
        {
            return;
        }
        
        curr = curr -> child[ind];
        curr -> cai--;
    }
    curr -> endOfWord--;
}
int main()
{
    int op;
    
    Trie* root = createNewNode();
    while (fin >> op)
    {
        string s;
        fin >> s;
        if (op == 0)
        {
            insert(root, s);
        }
        else if (op == 1)
        {
            delete_node(root, s);
        }
        else if (op == 2)
        {
            fout << search(root, s) << '\n';
        }
        else if (op == 3)
        {
            fout << longest_prefix(root, s) << '\n';
        }
    }
}