Cod sursa(job #2126545)

Utilizator MarinPeptenaruMarin Vasile Peptenaru MarinPeptenaru Data 9 februarie 2018 18:42:12
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.52 kb
#include <bits/stdc++.h>

using namespace std;
ifstream in("trie.in");
ofstream out("trie.out");
struct nod
{
    int inf;
    int last;
    nod *f[30];
    nod()
    {
        inf=0;
        last=0;
        memset(f,0,sizeof(f));
    }
};
nod *root, *aux, *q;
int op,lg;
char s[22];
void ins ()
{
    q=root;
    lg=strlen(s);
    for(int i=0; i<lg; i++)
    {
        if(!q->f[s[i]-'a'])
        {
            aux=new nod;
            q->f[s[i]-'a']=aux;
        }
        q=q->f[s[i]-'a'];
        q->inf++;
        q->last+=(i==lg-1);
    }
}
void elim (int i, nod *q)
{
    q->f[s[i]-'a']->inf--;
    if(i+1==lg-1) q->f[s[i]-'a']->last--;
    else elim(i+1,q->f[s[i]-'a']);
    if(q->f[s[i]-'a']->inf==0)
        q->f[s[i]-'a']=0;
}
int ap ()
{
    q=root;
    lg=strlen(s);
    for(int i=0; i<lg; i++)
    {
        if(!q->f[s[i]-'a']) return 0;
        q=q->f[s[i]-'a'];
        if(i==lg-1)
            return q->last;
    }
}
int pref ()
{
    q=root;
    lg=strlen(s);
    for(int i=0; i<lg; i++)
    {
        if(!q->f[s[i]-'a']) return q->inf+1;
        q=q->f[s[i]-'a'];
        if(i==lg-1)
            return q->inf;
    }
}
int main()
{
    root=new nod;
    while(in>>op,in.get(),in>>s)
    {
        if(op==0)
            ins();
        else if(op==1)
        {
            lg=strlen(s);
            elim(0,root);
        }
        else if(op==2)
            out<<ap()<<'\n';
        else if(op==3)
            out<<pref()<<'\n';
    }
    return 0;
}