Cod sursa(job #2410567)

Utilizator catalina200029Olteanu Catalina catalina200029 Data 20 aprilie 2019 10:40:28
Problema Trie Scor 55
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.72 kb
#include <bits/stdc++.h>
#define LMAX 21

using namespace std;

FILE*f=fopen("trie.in","r");
FILE*g=fopen("trie.out","w");

struct Tnod {
    int nrAp,index,nrCuv;
    char c;
    Tnod(char c,int index) : c(c),index(index) {
        nrAp=1;
        nrCuv=0;
    }
};

vector<vector<Tnod> >t;

int op,n,i,nod,sz,j,ok,indexT,nrApT,l;
char s[LMAX];

int main() {
    t.push_back(vector<Tnod>());
    while (!feof(f)) {
        fscanf(f,"%d%s ",&op,s);
        j=nod=0;
        n=strlen(s);
        switch (op) {
            case 0: ///adaugare
                while (j<n) {
                    ok=0;
                    sz=t[nod].size();
                    for (i=0;i<sz;i++) {
                        cout<<t[nod][i].c<<' '<<s[j]<<'\n';
                        if (t[nod][i].c==s[j]) {
                            ok=1;
                            cout<<"daaaa";
                            break;
                        }
                    }
                    if (ok) {
                        cout<<s[j]<<' ';
                        t[nod][i].nrAp++;
                        if (j==n-1) t[nod][i].nrCuv++;
                        nod=t[nod][i].index;
                    }
                    else {
                        t.push_back(vector<Tnod>());
                        t[nod].push_back(Tnod(s[j],++indexT));
                        if (j==n-1) t[nod][sz].nrCuv++;
                        nod=indexT;
                    }
                    j++;
                }
                break;
            case 1: ///stergere o aparitie
            case 2: ///afisare numar aparitii
            case 3: ///lungimea celui mai lung prefix comun
                l=0;
                while (j<n) {
                    ok=0;
                    sz=t[nod].size();
                    for (i=0;i<sz;i++)
                        if (t[nod][i].c==s[j]) {
                            ok=1;
                            break;
                        }
                    if (ok) {
                        if (t[nod][i].nrAp) l++;
                        if (op==1) t[nod][i].nrAp--; ///stergere
                        if (j==n-1)
                            if (op==1) t[nod][i].nrCuv--;
                            else if (op==2) fprintf(g,"%d\n",t[nod][i].nrCuv);
                            else if (op==3) fprintf(g,"%d\n",l);
                        nod=t[nod][i].index;
                        j++;
                    }
                    else {
                        if (op==2) fprintf(g,"0\n");
                        else if (op==3) fprintf(g,"%d\n",l);
                        break;
                    }

                }
                break;
        }
    }

    return 0;
}