Cod sursa(job #1852027)

Utilizator MithrilBratu Andrei Mithril Data 20 ianuarie 2017 13:57:02
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.68 kb
#include <bits/stdc++.h>
//Original source : Oanea Smit Andrei (Smit@infoarena)
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;
}