Cod sursa(job #1801691)

Utilizator plecinspaniaCapsunar plecinspania Data 9 noiembrie 2016 15:23:05
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.75 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct Nod
{
    int cnt,info;
    Nod *leg[26];
    Nod(int v)
    {
        cnt=v;
        info=0;
        for(int i=0;i<26;i++)
            leg[i]=NULL;
    }
};

Nod *rad;


inline void Adauga(const char s[])
{
    int i,j;
    Nod *p;
    Nod *q;
    p=rad;
    for(i=0;s[i];i++)
    {
        j=s[i]-'a';
        if(p->leg[j]!=NULL)
            p=p->leg[j];
        else
        {
            q=new Nod(0);
            p->leg[j]=q;
            p=q;
        }
        p->info++;
    }
    p->cnt++;
}

inline void Sterge(const char s[])
{
    int i,j;
    Nod *p;
    p=rad;
    for(i=0;s[i];i++)
    {
        j=s[i]-'a';
        p=p->leg[j];
        p->info--;
    }
    p->cnt--;
}

inline int Print(const char s[])
{
    int i,j;
    Nod *p;
    p=rad;
    for(i=0;s[i];i++)
    {
        j=s[i]-'a';
        if(p->leg[j]==NULL) return 0;
        p=p->leg[j];
    }
    return p->cnt;
}

inline int Prefix(char s[])
{
    int i,j;
    Nod *p;
    p=rad;
    int contor=0;
    for(i=0;s[i];i++)
    {
        j=s[i]-'a';
        if(p->leg[j]==NULL)
            return contor;
        else
        {
            p=p->leg[j];
            if(p->info!=0) contor++;
            else return contor;
        }
    }
    return contor;
}
char s[25];
void Citire()
{
    int cerinta;
    while(fin>>cerinta>>s)
    {
        if(cerinta==0) Adauga(s);
        else if(cerinta==1) Sterge(s);
        else if(cerinta==2) fout<<Print(s)<<"\n";
        else fout<<Prefix(s)<<"\n";
    }
    fin.close();
    fout.close();
}

int main()
{
    rad=new Nod(0);
    Citire();
    return 0;
}