Cod sursa(job #1474452)

Utilizator pepsiM4A1Ozturk Arif pepsiM4A1 Data 22 august 2015 00:13:29
Problema Trie Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 2.05 kb
#include <cstdio>
#include <vector>
#include <cstring>
using namespace std;
vector<int>ram;
int post=2;
struct trie
{
    int sfarsit;
    int nrap;
    int aparitie[27];
    int fiu[27];
}a[100005];
char ch[50];
void add()
{
    int lun=strlen(ch);
    int nod=1;
    for(int i=0;i<lun;i++)
    {
        if(a[nod].aparitie[ch[i]-'a']==0)
        {
            a[nod].aparitie[ch[i]-'a']=1;
            if(ram.empty())
            {
                a[nod].fiu[ch[i]-'a']=post;
                post++;
            }
           /* else
            {
                a[nod].fiu[ch[i]-'a']=ram.back();
                ram.pop_back();
            }*/
        }
        nod=a[nod].fiu[ch[i]-'a'];
        a[nod].nrap++;
    }
    a[nod].sfarsit++;
}
void rem()
{
    int lun=strlen(ch);
    int nod=1;
    bool as=0;
    for(int i=0;i<lun;i++)
    {
        int temp=a[nod].fiu[ch[i]-'a'];
        if(as==1)
        {
            a[nod].fiu[ch[i]-'a']=0;
            a[nod].aparitie[ch[i]-'a']=0;
            as=0;
        }
        nod=temp;
        a[nod].nrap--;
        if(a[nod].nrap==0)
        {
            ram.push_back(nod);
            as=1;
        }
    }
    a[nod].sfarsit--;
}
void check()
{
    int lun=strlen(ch);
    int nod=1;
    for(int i=0;i<lun;i++) nod=a[nod].fiu[ch[i]-'a'];
    printf("%d\n",a[nod].sfarsit);
}
void pref()
{
    int lun=strlen(ch);
    int nod=1,ct=0;
    for(int i=0;i<lun;i++)
    {
        if(a[nod].aparitie[ch[i]-'a']==1)
        {
            ct++;
            nod=a[nod].fiu[ch[i]-'a'];
            if(a[nod].nrap==0)
            {
                ct--;
                break;
            }
        }
        else break;
    }
    printf("%d\n",ct);
}
int main()
{
    freopen ("trie.in","r",stdin);
    freopen ("trie.out","w",stdout);
    int op;
    while(1)
    {
        scanf("%d%s",&op,ch);
        if(feof(stdin)) break;
        if(op==0) add();
        else if(op==1) rem();
        else if(op==2) check();
        else pref();
    }
}