Cod sursa(job #3294747)

Utilizator luca._.solosluca solos luca._.solos Data 27 aprilie 2025 20:10:52
Problema Trie Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.51 kb
#include <bits/stdc++.h>

using namespace std;

struct Trie
{
    char curr;
    int ap=0;
    vector <Trie> kids;
}dad;

void add_word(string word)
{
    int i=0, sz=word.size();
    Trie* curr=&dad;
    while(i<sz)
    {
        bool gasit=false;
        for(auto &urmas:curr->kids)
        {
            if(urmas.curr==word[i])
            {
                urmas.ap++;
                curr=&urmas;
                i++;
                gasit=true;
                break;
            }
        }
        if(!gasit)
        {
            curr->kids.push_back({word[i], 1, {}});
            curr=&curr->kids.back();
            i++;
        }
    }
}

void remove_word(string word)
{
    int i=0, sz=word.size();
    Trie* curr=&dad;
    while(i<sz)
    {
        int id=0;
        for(auto &urmas:curr->kids)
        {
            if(urmas.curr==word[i])
            {
                urmas.ap--;
                i++;
                if(urmas.ap==0)
                {
                    curr->kids.erase(curr->kids.begin()+id);
                    return;
                }
                curr=&urmas;
                break;
            }
            id++;
        }
    }
}

int count_word(string word)
{
    int i=0, sz=word.size();
    Trie curr=dad;
    while(i<sz)
    {
        bool gasit=false;
        for(auto urmas:curr.kids)
        {
            if(urmas.curr==word[i])
            {
                i++;
                curr=urmas;
                gasit=true;
                break;
            }
        }
        if(!gasit) return 0;
    }
    int ans=curr.ap;
    for(auto urmas:curr.kids)
    {
        ans-=urmas.ap;
    }
    return ans;
}

int longest_prefix(string word)
{
    int i=0, sz=word.size(), ans=0;
    Trie curr=dad;
    while(i<sz)
    {
        bool gasit=false;
        for(auto urmas:curr.kids)
        {
            if(urmas.curr==word[i])
            {
                gasit=true;
                ans++;
                i++;
                curr=urmas;
                break;
            }
        }
        if(!gasit) return ans;
    }
    return ans;
}

int main()
{
    ifstream cin("trie.in");
    ofstream cout("trie.out");

    int type;
    string word;
    while(cin>>type>>word)
    {
        if(type==0) add_word(word);
        if(type==1) remove_word(word);
        if(type==2) cout<<count_word(word)<<'\n';
        if(type==3) cout<<longest_prefix(word)<<'\n';
    }

    return 0;
}