Cod sursa(job #1978030)

Utilizator TudoseSanzianaTudose Sanziana TudoseSanziana Data 6 mai 2017 19:32:26
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.51 kb
#include <bits/stdc++.h>
using namespace std;

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

struct Trie
{
    int nap,nedges;
    Trie* edges[26];
    Trie()
    {
        nap=nedges=0;
        memset(edges,0,sizeof(edges));
    }
};

int t; string str;

void inserare(Trie* tmp)
{
    for(int i=0; i<str.length(); i++)
    {
        if(!tmp->edges[str[i]-'a'])
            {
                tmp->edges[str[i]-'a']=new Trie;
                tmp=tmp->edges[str[i]-'a'];
            }
        else tmp=tmp->edges[str[i]-'a'];
        (tmp->nedges)++;
    }
    (tmp->nap)++;
}

void stergere(Trie* tmp)
{
    for(int i=0; i<str.length(); i++)
    {
        tmp=tmp->edges[str[i]-'a'];
        --(tmp->nedges);
    }
    (tmp->nap)--;
}

int aparitii(Trie* tmp)
{
    for(int i=0; i<str.length(); i++)
    {
        if(!tmp->edges[str[i]-'a']) return 0;
        tmp=tmp->edges[str[i]-'a'];
    }
    return tmp->nap;
}

int prefix(Trie* tmp)
{
    for(int i=0; i<str.length(); i++)
    {
        if((!tmp->edges[str[i]-'a']) || (!tmp->edges[str[i]-'a']->nedges))
            return i;
        tmp=tmp->edges[str[i]-'a'];
    }
    return str.length();
}

int main()
{
    Trie* root= new Trie;
    while(in>>t>>str)
    {
        switch(t)
        {
        case 0: inserare(root); break;
        case 1: stergere(root); break;
        case 2: out<<aparitii(root)<<'\n'; break;
        case 3: out<<prefix(root)<<'\n'; break;
        }
    }

    return 0;
}