Cod sursa(job #2651527)

Utilizator CiboAndreiAndrei Cibo CiboAndrei Data 22 septembrie 2020 20:30:11
Problema Trie Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.96 kb
#include <bits/stdc++.h>

using namespace std;

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

const int dim = 100003;

int n = 0;

struct str{
    int ord;
    char val;
};

vector <str> v[dim];
int nrcuv[dim], nrlit[dim];

void add(char cuv[23]){
    int prt = 0, i = -1;
    char c = cuv[0];
    bool ok = 1;

    while(ok){
        ok = 0;
        c = cuv[++i];
        if(c == 0)
            break;

        for(str it: v[prt]){
            if(it.val == c){
                prt = it.ord;
                ++nrlit[prt];
                ok = 1;

                break;
            }
        }
    }

    str aux;

    while(cuv[i]){
        aux.val = cuv[i];
        aux.ord = ++n;
        v[prt].push_back(aux);
        prt = n;
        ++nrlit[prt];
        ++i;
    }

    ++nrcuv[prt];
}

void rmv(char cuv[23]){
    int prt = 0, i = -1;
    char c = cuv[0];
    bool ok = 1;

    while(ok){
        ok = 0;
        c = cuv[++i];
        if(c == 0){
            --nrcuv[prt];
            return;
        }

        for(str it: v[prt]){
            if(it.val == c){
                prt = it.ord;
                --nrlit[prt];
                ok = 1;

                break;
            }
        }
    }
}

void nrap(char cuv[23]){
    int prt = 0, i = -1;
    char c = cuv[0];
    bool ok = 1;

    while(ok){
        ok = 0;
        c = cuv[++i];
        if(c == 0){
            g << nrcuv[prt] << '\n';
            return;
        }

        for(str it: v[prt]){
            if(it.val == c){
                prt = it.ord;
                ok = 1;

                break;
            }
        }
    }

    g << "0 \n";
}

void pref(char cuv[23]){
    int prt = 0, i = -1, lung = 0;
    char c = cuv[0];
    bool ok = 1;

    while(ok){
        ok = 0;
        c = cuv[++i];
        if(c == 0){
            g << lung << '\n';
            return;
        }

        for(str it: v[prt]){
            if(it.val == c){
                prt = it.ord;
                ok = 1;
                if(nrlit[it.ord] > 0)
                    ++lung;
                else {
                    g << lung << '\n';
                    return;
                }

                break;
            }
        }
    }

    g << lung << '\n';
}

int main()
{
    int i = 0, op;
    char cuv[23];

    while(f >> op >> cuv){
        switch(op){
            case 0: { add(cuv); break; }
            case 1: { rmv(cuv); break; }
            case 2: { nrap(cuv); break;}
            case 3: { pref(cuv); break;}
        }
    }

    /*
    for(i = 0; i <= n; ++i){
        for(str it: v[i]){
            g << i << "-" << nrcuv[i] << "-" << nrlit[i] << " " << it.ord << "-" << nrcuv[it.ord] << "-" << nrlit[it.ord] << " " << it.val << '\n';
            //g << i << " " << it.ord << " " << it.val << '\n';
        }
    }
*/
    return 0;
}