Cod sursa(job #2183285)

Utilizator rnqftwcalina florin daniel rnqftw Data 22 martie 2018 23:17:59
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include<bits/stdc++.h>

using namespace std;

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

const int CMax=2e6+3;

struct {
    int pre,cuv;
    int son[30];
}t[CMax];



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(in>>tip>>s)
    {
        if(tip==0) adauga();
        else if(tip==1) sterge();
        else if(tip==2) out<<aparitii()<<'\n';
        else out<<prefix()<<'\n';
    }
    return 0;
}