Cod sursa(job #2988537)

Utilizator ioana.cCaprariu Ioana ioana.c Data 4 martie 2023 20:26:12
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.69 kb
#include <fstream>

using namespace std;

ifstream fin("trie.in");
ofstream fout ("trie.out");

struct nod
{
    int cnt;
    int last;
    nod *f[30];
};

nod* create(){
    nod *nou = new nod;
    int i;
    nou->cnt = 0;
    nou->last = 0;
    for (i=0;i<26;i++)
        nou->f[i] = NULL;
    return nou;
}

void add(nod *r, string s){
    for(int i=0; s[i]; i++){
        char x = s[i];
        int v = x - 'a';
        if(!r->f[v])
            r->f[v] = create();
        r = r->f[v];
        r->cnt++;
    }
    r->last++;
}

void erase(nod *r, string s){
    for(int i=0; s[i]; i++){
        char x = s[i];
        int v = x - 'a';
        r = r->f[v];
        r->cnt--;
    }
    r->last--;
}

int app(nod *r,string s){
    for(int i=0; s[i]; i++){
        char x = s[i];
        int v = x - 'a';
        if(!r->f[v])
            return 0;
        r = r->f[v];
        if(r->cnt == 0)
            return 0;
    }
    return r->last;
}

int lcp(nod *r, string s){
    int ans=0;
    for(int i=0; s[i]; i++){
        char x = s[i];
        int v = x - 'a';
        if(!r->f[v])
            return ans;
        r = r->f[v];
        if(r->cnt == 0)
            return ans;
        ans++;
    }
    return ans;
}

int main()
{
    ios::sync_with_stdio(false);
    fin.tie(0); fout.tie(0);
    int t;
    nod *rad = create();
    while(fin >> t){
        string s;
        fin >>  s;
        if(t == 0)
            add(rad, s);
        else if(t == 1)
            erase(rad, s);
        else if(t == 2)
            fout << app(rad, s) << '\n';
        else if(t == 3)
            fout << lcp(rad, s) << '\n';
    }
    return 0;
}