Cod sursa(job #2181784)

Utilizator usureluflorianUsurelu Florian-Robert usureluflorian Data 21 martie 2018 20:44:35
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 kb
#include <fstream>
using namespace std;
ifstream f ("trie.in");
ofstream g ("trie.out");
const int nmax=2e6+3;
struct
{
    int pre,cuv;
    int son[33];
}t[nmax];
int tip,nod,urm,nr;
string s;
void adauga()
{
    nod=0;
    for(int i=0;i<s.size();++i)
    {
        urm=t[nod].son[s[i]-'a'];
        if(!urm)
        {
            urm=++nr;
            t[nod].son[s[i]-'a']=urm;
        }
        ++t[urm].pre;
        nod=urm;
    }
    ++t[nod].cuv;
}
void sterge()
{
    nod=0;
    for(int i=0;i<s.size();++i)
    {
        urm=t[nod].son[s[i]-'a'];
        --t[urm].pre;
        nod=urm;
    }
    --t[nod].cuv;
}
int aparitii()
{
    nod=0;
    for(int i=0;i<s.size();++i)
    {
        urm=t[nod].son[s[i]-'a'];
        if(!t[urm].pre) return 0;
        nod=urm;
    }
    return t[urm].cuv;
}
int prefix()
{
    nod=0;
    for(int i=0;i<s.size();++i)
    {
        urm=t[nod].son[s[i]-'a'];
        if(!t[urm].pre) return i;
        nod=urm;
    }
    return s.size();
}
int main()
{
    while(f>>tip>>s)
    {
        if(tip==0) adauga();
        else if(tip==1) sterge();
        else if(tip==2) g<<aparitii()<<'\n';
        else g<<prefix()<<'\n';
    }
    return 0;
}