Cod sursa(job #2181559)

Utilizator catalina200029Olteanu Catalina catalina200029 Data 21 martie 2018 18:54:18
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.88 kb
#include <bits/stdc++.h>

using namespace std;

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

struct nod {
    int nrfii,ind,nr,term;
    nod *fii[26];

    nod() {
        term=0;
        nr=0;
        ind=0;
        nrfii=0;
        memset(fii,0,sizeof(fii));
    }
}*T;

void adaug(char *s,nod *&p) { ///adauga o aparitie a cuvantului s in lista
    if (p->fii[*s-'a']==0) {
        p->fii[*s-'a']=new nod;
        p->fii[*s-'a']->ind=p->ind+1;
        p->nr++;
    }
    p->fii[*s-'a']->nrfii++;
    if (*(s+1)) adaug(s+1,p->fii[*s-'a']);
    else p->fii[*s-'a']->term++;
    //cout<<*s<<' '<<p->fii[*s-'a']->nrfii<<' '<<p->fii[*s-'a']->ind<<"     ";
}

void q3(char *s,nod *p,int &r) { ///tipareste lungimea celui mai lung prefix comun al lui s cu oricare cuvant din lista
    //cout<<s<<' ';
    if (p->fii[*s-'a']!=0) {
        r=max(r,p->fii[*s-'a']->ind);
        if (*(s+1)) q3(s+1,p->fii[*s-'a'],r);
    }
}

void q1(char *s,nod *p) { ///sterge o aparitie a cuvantului w din lista
    if (*(s+1)) q1(s+1,p->fii[*s-'a']);
    else p->fii[*s-'a']->term--;
    p->fii[*s-'a']->nrfii--;
    if (p->fii[*s-'a']->nrfii==0) {
        p->fii[*s-'a']=0;
        p->nr--;
    }
}

void q2(char *s,nod *p,int &r) { ///tipareste numarul de aparitii ale cuvantului s in lista
    if (p->fii[*s-'a']!=0) {
        if (*(s+1)) q2(s+1,p->fii[*s-'a'],r);
        else if (p->fii[*s-'a']->term) r=p->fii[*s-'a']->term;
    }
}

int main() {
    char s[26];
    int x,y;
    T=new nod;
    while (f>>x>>s) {
        if (x==0) adaug(s,T);
        else if (x==1) {
            q1(s,T);
        }
        else if (x==2) {
            y=0;
            q2(s,T,y);
            g<<y<<'\n';
        }
        else if (x==3) {
            y=0;
            q3(s,T,y);
            g<<y<<'\n';
        }
        *s=NULL;
        //cout<<'\n';
    }
    return 0;
}