Cod sursa(job #2139271)

Utilizator MarinPeptenaruMarin Vasile Peptenaru MarinPeptenaru Data 22 februarie 2018 12:32:42
Problema Trie Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.53 kb
#include <bits/stdc++.h>
#define cod(x) x-'a'
using namespace std;
ifstream in("trie.in");
ofstream out("trie.out");
const int nx=100002;
int op,lg,pref;
char s[260];
struct trie
{
    int pref;
    int cuv;
    trie *next[27];
    trie()
    {
        pref=0;
        cuv=0;
        memset(next,0,sizeof(next));
    }
};
trie *root= new trie;
void ins(int poz, trie *t)
{
    if(!t->next[cod(s[poz])])
        t->next[cod(s[poz])]=new trie;
    t=t->next[cod(s[poz])];
    t->pref++;
    if(poz==lg-1)
        t->cuv++;
    else
        ins(poz+1,t);
}
void del (int poz, trie *t)
{
    t=t->next[cod(s[poz])];
    t->pref--;
    if(poz==lg-1)
        t->cuv--;
    else
        del(poz+1,t);
}
int nr_cuv (int poz, trie *t)
{
    if(!t->next[cod(s[poz])]) return 0;
    t=t->next[cod(s[poz])];
    if(poz==lg-1)
        return t->cuv;
    else
        nr_cuv(poz+1,t);
}
void max_pref( int poz, trie *t)
{
    if(!t->next[cod(s[poz])]) return ;
    t=t->next[cod(s[poz])];
    if(t->pref>=1)
        pref++;
    else
        return;
    if(poz==lg-1)
        return;
    else
        max_pref(poz+1,t);
}
int main()
{
    root= new trie;
    while(in>>op>>s)
    {
        lg=strlen(s);
        if(op==0)
            ins(0,root);
        else if(op==1)
            del(0,root);
        else if(op==2)
            out<<nr_cuv(0,root)<<'\n';
        else if(op==3)
        {
            pref=0;
            max_pref(0,root);
            out<<pref<<'\n';
        }
    }
    return 0;
}