Cod sursa(job #2198268)

Utilizator PredaBossPreda Andrei PredaBoss Data 24 aprilie 2018 06:48:07
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include <bits/stdc++.h>

using namespace std;
vector<pair<short,int> >legaturi[2000000];
vector<unsigned short>nod;
int c;
string cuv;
char aux[25];
void add(int t)
{
    int pos=0;
    int counter=0;
    bool k=1;
    while(counter!=cuv.size())
    {
        int i;
    for(i=0;i<legaturi[pos].size();i++)
        if(legaturi[pos][i].first==cuv[counter]-'a')
            break;
    if(i==legaturi[pos].size())
    {
        k=0;
        break;
    }
    pos=legaturi[pos][i].second;
    counter++;
    }
    if(t==0)
    {
        if(k==1)
            printf("%d\n",nod[pos]);
        else
            printf("0\n");
    }
    else
    {
    if(k==1)
        nod[pos]+=t;
    else
    {
        for(int i=counter;i<cuv.size();i++)
        {
            legaturi[pos].push_back({cuv[i]-'a',nod.size()});
            if(i+1<cuv.size())
            {
                nod.push_back(0);
                pos=nod.size()-1;
            }
            else
                nod.push_back(1);
        }
    }
    }
}
int main()
{
    freopen("trie.in","r",stdin);
    freopen("trie.out","w",stdout);
    nod.push_back(0);
    while(!feof(stdin))
    {
        scanf("%d %s",&c,aux);
        cuv=string(aux);
        if(c==0)
        {
            add(1);
            continue;
        }
        if(c==1)
        {
            add(-1);
            continue;
        }
        if(c==2)
        {
            add(0);
            continue;
        }

    }
    return 0;
}