Cod sursa(job #3179785)

Utilizator ayannnnAyan Sorouri-Amoughin ayannnn Data 4 decembrie 2023 10:53:25
Problema Trie Scor 55
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.94 kb
#include <iostream>
#include <fstream>
#include <cstring>

using namespace std;

ifstream f("trie.in");
ofstream g("trie.out");

struct nod{
    int subtree; //cate cuvinte trec prin acest nod
    int freq; //nr de cuv care se termina pe aceasta pozitie, prefix
    nod *next[26];
};

void ins(nod *n, string &s, int poz){
    if (poz == s.size()) {
        n->freq++;
        n->subtree++;
        return;
    }
    int charIdx = s[poz] - 'a';
    if (n->next[charIdx] == nullptr) {
        n->next[charIdx] = new nod();
    }
    ins(n->next[charIdx], s, poz + 1);
    /*n->frecv++;
    if(poz == s.size()){
        n->t++;
        return;
    }*/
    n->subtree++;
}

void del(nod *n, string &s, int poz){
    if(poz == s.size()){
        n->subtree--;
        n->freq--;
        return;
    }
    int charIdx = s[poz] - 'a';
    del(n->next[charIdx], s, poz+1);
    n->subtree++;
}
//tipareste nr de apartiiti ale cuvantului w in lista
int queryCount(nod *n, string &s, int poz){
    if(poz == s.size())
        return n->freq;
    int charIdx = s[poz] - 'a';
    if(n->next[charIdx] == nullptr)
        return 0;
    return queryCount(n->next[charIdx], s, poz+1);
}

//tipareste lungimea celui mai lung prefix comun al lui w cu oricare cuvant din lista

int queryPrefix(nod *n, string &s, int poz){
    if(n->subtree == 0)
        return poz - 1;
    if(poz == s.size()) {
        return poz;
    }
    int charIdx = s[poz] - 'a';
    if(n->next[charIdx] == nullptr) {
        return poz;
    }
    return queryPrefix(n->next[charIdx], s, poz + 1);
}

nod *trie = new nod();

int main()
{
    int op;
    while(f>>op){
        string s;
        f>>s;
        if(op==0)
            ins(trie,s,0);
        else if(op==1)
            del(trie,s,0);
        else if(op==2)
            g<<queryCount(trie,s,0)<<'\n';
        else
            g<<queryPrefix(trie,s,0)<<'\n';
    }
    return 0;
}