Cod sursa(job #2482410)

Utilizator Stefan_PiscuPiscu Stefan Constantin Stefan_Piscu Data 28 octombrie 2019 11:13:55
Problema Trie Scor 15
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.78 kb
#include <bits/stdc++.h>
using namespace std;

ifstream fin("trie.in");
ofstream fout("trie.out");

int x;
string s;

struct trie
{
    trie* c[27];
    int nrp, nre;
}node;

trie* create()
{
    trie *x=new trie;
    x->nre=0;
    x->nrp=0;
    for(int i=0;i<=26;++i) x->c[i]=NULL;
    return x;
}

void baga(trie *root, string s)
{
    trie *p=root;
    for(int i=0;i<s.size();i++)
    {
        int index=s[i]-'a';
        if(!p->c[index]) p->c[index]=create();
        p->nrp++;
        p=p->c[index];
    }
    p->nrp++;
    p->nre++;
}

int cauta(trie *root, string s)
{
    trie *p=root;
    for(int i=0;i<s.size();++i)
    {
        int index=s[i]-'a';
        if(!p->c[index]) return 0;
        p=p->c[index];
    }
    return p->nre;
}

int cauta3(trie *root, string x)
{
    trie *p=root;
    int i;
    for(i=0;i<s.size()&&(p->nrp>1);++i)
    {
        int index=s[i]-'a';
        if(!p->c[index]) return i;
        p=p->c[index];
    }
    return i;
}

void scoate(trie *root, string s, int depth)
{
    if(depth==s.size())
    {
        root->nre--;
        root->nrp--;
        if(root->nrp==0) delete root, root=NULL;
    }
    else
    {
        int index=s[depth]-'a';
        scoate(root->c[index], s, depth+1);
        root->nrp--;
        if(root->nrp==0) delete root, root=NULL;
    }
}

int main()
{
    trie *node=create();
    while(fin>>x)
    {
        fin>>s;
        if(x==0)
        {
            baga(node, s);
        }
        else if(x==1)
        {
            scoate(node, s, 0);
        }
        else if(x==2)
        {
            fout<<cauta(node, s)<<"\n";
        }
        else
        {
            fout<<cauta3(node, s)<<"\n";
        }
    }
    return 0;
}