Cod sursa(job #1088790)

Utilizator Juve45UAIC Alexandru Ionita Juve45 Data 20 ianuarie 2014 20:20:42
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.13 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;
    int out;
    tree* v[27];
    tree()
    {
        n=0;
        out=0;
        for(int i=0;i<=27;i++)
            v[i]=0;
    }
};
//vector <tree > t;

tree *ant= new tree;

/*
void update_1(char a[])
{
    tree ant=start;
    for(int i=0; i<strlen(a)-1; i++)
    {
        tree asd;
        if(ant.v[a[i]-'a'])
        {
            ant.v[a[i]-'a']=&asd;
            ant.out++;
        }
        ant=asd;

    }
    ant.n++;
    cout<<a<<' '<<&ant<<"  ant.n:"<<ant.n<<'\n';

}*/

void update_1(tree *ant, char *a)
{

    if(a[0]==0)
{        ant->n++;
        //cout<<a<<' '<<&ant<<"  ant.n:"<<ant->n<<'\n';
}
    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);
    }
}

void update_2(tree *ant,char *a)
{
    if(a[0]==0)
    {if(ant->n==1)
delete ant;
else ant->n--;
    }
    else{
        if(ant->v[a[0]-'a']==0) return;
        update_2(ant->v[a[0]-'a'], a+1);

    if(ant->out==0 &&qk==0)
    {
        delete ant;
       qk=1;
    }
    }
}



int querry_1(tree *ant,char *a)
{
    if(a[0]==0)
        return ant->n;
    else
        if(ant->v[a[0]-'a']==0) return 0;
        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)
        {
         //   tree *ant=new tree;

            if(k==0)
                update_1(ant,x);
                 else if(k==1)
                 {qk=0;
            update_2(ant, x);
                 }
            else if(k==2)
                fout<<querry_1(ant,x)<<'\n';
            else if(k==3)
                fout<<querry_2(ant,x)<<'\n';

        }
        return 0;

    }