Cod sursa(job #1836867)

Utilizator SmitOanea Smit Andrei Smit Data 28 decembrie 2016 19:10:19
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.62 kb
#include <bits/stdc++.h>
using namespace std;

struct trie
{
    int frecv;
    int nr; //cate se termina in nod
    trie *s[26];
    trie()
    {
        nr = frecv = 0;
        for (int i = 0 ; i < 26; i++) s[i] = NULL;
    }
};

trie *root = new trie();
char sir[23];

void Adaugare(char sir[])
{
    int i;
    int L = strlen(sir);
    trie *p = root;

    for(i = 0; i < L; ++i)
    {
        if (p->s[sir[i] - 'a'] == NULL) p->s[sir[i] - 'a'] = new trie();
        p = p->s[sir[i] - 'a'];
        p->frecv++;
    }

    p->nr++;
}

void Stergere(char sir[])
{
    int i;
    int L = strlen(sir);
    trie *p = root;

    for(i = 0; i < L; ++i)
    {
        p = p->s[sir[i] - 'a'];
        p->frecv--;
    }
    p->nr--;
}

int NrAp(char sir[])
{
    int i,L;
    L=strlen(sir);
    trie *p = root;

    for(i = 0;i < L; ++i)
        if(p->s[sir[i] - 'a'] != NULL)
            p = p->s[sir[i] - 'a'];
        else
            return 0;
    return p->nr;
}

int Prefix(char sir[])
{
    int i, ans = 0;
    int L = strlen(sir);
    trie *p = root;
    i=0;
    while(i < L && p->s[sir[i] - 'a'] != NULL)
    {
        p = p->s[sir[i] - 'a'];
        if (p->frecv > 0) ans++;
        i++;
    }
    return ans;
}

int main()
{
   int op;
    ifstream fin("trie.in");
    ofstream fout("trie.out");
    while(fin>>op)
    {
        fin >> sir;
        if(op==0)
            Adaugare(sir);
        if(op==1)
            Stergere(sir);
        if(op==2)
            fout<<NrAp(sir)<<"\n";
        if(op==3)
            fout<<Prefix(sir)<<"\n";
    }

    return 0;}