Cod sursa(job #2394940)

Utilizator DovlecelBostan Andrei Dovlecel Data 2 aprilie 2019 09:23:50
Problema Trie Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.4 kb
#include <fstream>
#include <vector>
#include <cstring>

using namespace std;
ifstream in("trie.in");
ofstream out("trie.out");
char str[25];
int nr;

struct trie
{
    int cnt,lastcnt,next[30];
}newtrie;
vector<trie>v;

void add(unsigned poz,int nr,int val)//poz in cuvant,poz trie in vector,val=adaugare/stergere
{
    v[nr].cnt+=val;
    if(poz==strlen(str))
    {
        v[nr].lastcnt+=val;
        return;
    }
    if(!v[nr].next[str[poz]-'a'])
    {
        v.push_back(newtrie);
        v[nr].next[str[poz]-'a']=v.size()-1;
    }
    add(poz+1,v[nr].next[str[poz]-'a'],val);
}
int query1(unsigned poz,int nr)//pozitia literei in cuvant si pozitia trie in vector
{
    if(poz==strlen(str))
        return v[nr].lastcnt;
    if(v[nr].next[str[poz]-'a']!=0)
        return query1(poz+1,v[nr].next[str[poz]-'a']);
    return 0;
}
int query2(unsigned poz,int nr)
{
    if(poz==strlen(str))
        return bool(v[nr].cnt)*poz;
    if(!v[nr].cnt)
        return max(poz-1,(unsigned)0);
    if(v[nr].next[str[poz]-'a'])
        return query2(poz+1,v[nr].next[str[poz]-'a']);
    return poz;
}

int main()
{
    v.push_back(newtrie);
    while(in>>nr>>str)
    {
        if(nr==0)
            add(0,0,1);
        else if(nr==1)
            add(0,0,-1);
        else if(nr==2)
            out<<query1(0,0);
        else
            out<<query2(0,0);
    }
    return 0;
}