Cod sursa(job #1672376)

Utilizator superstar1998Moldoveanu Vlad superstar1998 Data 2 aprilie 2016 17:36:42
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <bitset>
#include <algorithm>
#include <cstring>
#define pb push_back
#define mp make_pair
#define INFILE "trie.in"
#define OUTFILE "trie.out"
using namespace std;
ifstream f(INFILE);
ofstream g(OUTFILE);
struct trie
{
    int x,nrf;
    trie* fiu[27];
    trie()
    {
        x=nrf=0;
        memset(fiu,0,sizeof(fiu));
    }
}*vf=new trie;
int op;
char cuv[25];
void add(trie* nod, char* s)
{
    if(s[0]==0)nod->x++;
    else
    {
        if(!nod->fiu[s[0]-'a'])
        {
            nod->nrf++;
            nod->fiu[s[0]-'a']=new trie;
        }
        add(nod->fiu[s[0]-'a'],s+1);
    }
}
bool sterg(trie* nod, char*s)
{
    if(s[0]==0)nod->x--;
    else if(sterg(nod->fiu[s[0]-'a'],s+1))
    {
        nod->fiu[s[0]-'a']=0;
        nod->nrf--;
    }
    if(nod->x==0&&nod->nrf==0&&nod!=vf)
    {
        delete nod; return 1;
    }
    return 0;
}
int caut(trie* nod, char* s)
{
    if(s[0]==0)return nod->x;
    if(nod->fiu[s[0]-'a'])return caut(nod->fiu[s[0]-'a'],s+1);
    return 0;
}
int pref(trie* nod, char* s, int k)
{
    if(s[0]==0||nod->fiu[s[0]-'a']==0)return k;
    return pref(nod->fiu[s[0]-'a'],s+1,k+1);
}
int main()
{
    while(f>>op>>cuv)
    {
        if(!op)add(vf,cuv);
        else if(op==1)sterg(vf,cuv);
        else if(op==2)g<<caut(vf,cuv)<<'\n';
        else g<<pref(vf,cuv,0)<<'\n';
    }
    f.close();
    g.close();
    return 0;
}