Cod sursa(job #2810913)

Utilizator puica2018Puica Andrei puica2018 Data 30 noiembrie 2021 16:43:13
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.79 kb
#include <bits/stdc++.h>
using namespace std;

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

struct Trie
{
    int fr; /// frecventa de aparitie
    int cnt; /// cate cuvinte trec prin nod
    Trie *leg[26];

    Trie(int frecv, int contor)
    {
        fr = frecv;
        cnt = contor;
        for (int i = 0; i < 26; i++)
            leg[i] = NULL;
    }
};
Trie *T;

void Op0(char cuv[])
{
    Trie *p, *q;
    int i, j;
    p = T;
    for (i = 0; cuv[i]; i++)
    {
        j = cuv[i] - 'a';
        if (p->leg[j] != NULL)
        {
            p = p->leg[j];
            p->cnt++;
        }
        else
        {
            q = new Trie(0,1);
            p->leg[j] = q;
            p=q;
        }
    }
    p->fr++;
}

void Op1(char cuv[])
{
    Trie *p=T;
    int j;
    for(int i=0; cuv[i]; i++)
    {
        j=cuv[i]-'a';
        p=p->leg[j];
        p->cnt--;
    }
    p->fr--;
}

int Op2(char cuv[])
{
    Trie *p=T;
    int j;
    for(int i=0; cuv[i]; i++)
    {
        j=cuv[i]-'a';
        if(p->leg[j]==NULL)
            return 0;
        p=p->leg[j];
    }
    return p->fr;
}

/// anual
/// are
/// ana

int Op3(char cuv[])
{
    Trie *p=T;
    int res=0;
    int j;
    for(int i=0; cuv[i]; i++)
    {
        j=cuv[i]-'a';
        if(p->leg[j]==NULL)
            return res;
        p=p->leg[j];
        if(p->cnt>0)
            res++;
        else
            return res;
    }
    return res;
}

int main()
{
    T = new Trie(0, 0);
    int t;
    char w[22];
    while(fin>>t>>w)
    {
        if(t==0)
            Op0(w);
        else if(t==1)
            Op1(w);
        else if(t==2)
            fout<<Op2(w)<<"\n";
        else
            fout<<Op3(w)<<"\n";
    }
    return 0;
}