Cod sursa(job #2986125)

Utilizator IoanMihaiIoan Mihai IoanMihai Data 27 februarie 2023 19:24:01
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.44 kb
#include<bits/stdc++.h>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct Trie {
    int cnt, ap;
    Trie *fiu[26];
    Trie() {
        cnt = ap = 0;
        memset(fiu, 0, sizeof(fiu));
    }
};
int tip;
string c;
Trie *T;
void ins(string s)
{
    Trie *x = T;
    for (int i=0;i<s.size();i++){
        int newn = s[i] - 'a';
        if (!x->fiu[newn])
            x->fiu[newn] = new Trie;
        x = x->fiu[newn];
        x->ap ++;
    }
    x->cnt ++;
}
void del(string s)
{
    Trie *x = T;
    for (int i=0;i<s.size();i++){
        int newn = s[i] - 'a';
        x = x->fiu[newn];
        x->ap --;
    }
    x->cnt --;
}
int apar(string s)
{
    Trie *x = T;
    for (int i=0;i<s.size();i++){
        int newn = s[i] - 'a';
        if (x->fiu[newn] && x->fiu[newn]->ap)
            x = x->fiu[newn];
        else
            return 0;
    }
    return x->cnt;
}
int pref(string s)
{
    Trie *x = T;
    int lg = 0;
    for (int i=0;i<s.size();i++){
        int newn = s[i] - 'a';
        if (x->fiu[newn] && x->fiu[newn]->ap)
            x = x->fiu[newn];
        else
            return lg;
        lg ++;
    }
    return lg;
}
int main()
{
    T = new Trie;
    while(fin >> tip >> c) {
        if (tip == 0) {
            ins(c);
        }else if (tip == 1){
            del(c);
        }else if (tip == 2){
            fout << apar(c) << '\n';
        }else{
            fout << pref(c) << '\n';
        }
    }
    return 0;
}