Cod sursa(job #2140572)

Utilizator Juve45UAIC Alexandru Ionita Juve45 Data 23 februarie 2018 17:23:51
Problema Trie Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.56 kb
#include <fstream>
//#include <iostream>
//#include <cstring>
#include <cstdio>
 
using namespace std;
 
ifstream fin("trie.in");
ofstream fout("trie.out");
 
int n, m, qk, lg;
char x[21];
 
struct tree
{
    int n, out;
    tree* v[27];
 
    tree()
    {
        n=0;
        out=0;
        for(int i=0; i<27; i++)
            v[i]=0;
    }
};
 
tree *ant2= new tree;
 
 
void update_1(tree *ant, char *a)
{
 
    if(a[0]==0)
    {
        ant->n++;
        return;
    }
    else if(ant->v[a[0]-'a']==0)
    {
        ant->v[a[0]-'a']= new tree;
        ant->out++;
    }
    update_1(ant->v[a[0]-'a'], a+1);
 
}
 
int update_2(tree *ant,char *a)
{
    if(a[0]==0)
        ant->n--;
    else
 
        if( update_2(ant->v[a[0]-'a'], a+1))
        {
            ant->out--;
            ant->v[a[0]-'a']=0;
        }
 
    if(ant->out==0 && ant->n==0 && ant!=ant2)
    {
        delete ant;
        return 1;
    }
    return 0;
}
 
 
 
int querry_1(tree *ant,char *a)
{
    if(a[0]==0)
        return ant->n;
    else if(ant->v[a[0]-'a']==0) return 0;
    return querry_1(ant->v[a[0]-'a'], a+1);
}
 
int querry_2(tree *ant,char *a)
{
    if(a[0]==0 || ant->v[a[0]-'a']==0)
        return 0;
    else return (querry_2(ant->v[a[0]-'a'],a+1)+1);
 
}
 
 
int main()
{
    int k;
 
    while(fin>>k>>x)
    {
        if(k==0)
            update_1(ant2,x);
        else if(k==1)
            update_2(ant2, x);
        else if(k==2)
            fout<<querry_1(ant2,x)<<'\n';
        else if(k==3)
            fout<<querry_2(ant2,x)<<'\n';
 
    }
    fin.close();
    fout.close();
    return 0;
 
}