Cod sursa(job #1642205)

Utilizator ZeBuGgErCasapu Andreas ZeBuGgEr Data 9 martie 2016 13:08:48
Problema Trie Scor 45
Compilator cpp Status done
Runda Arhiva educationala Marime 2.14 kb
#include<cstdio>
#include<cstring>
#include<vector>

using namespace std;

struct str
{
    int ap;
    int sf;
    int fiu[30];
}a[120010];

int type,maxp=1,res;
char ch[30];

vector<int> delq;

void add()
{
    int len=strlen(ch);
    int nod=1;

    for(int i=0;i<len;i++)
    {
        if(a[nod].fiu[ch[i]-'a']==0)
        {
            if(!delq.empty())
            {
                a[nod].fiu[ch[i]-'a']=delq.back();
                delq.pop_back();
            }
            else
            {
                maxp++;
                a[nod].fiu[ch[i]-'a']=maxp;
            }
        }
        nod=a[nod].fiu[ch[i]-'a'];
        a[nod].ap++;
    }
    a[nod].sf++;
}

void del()
{
    int len=strlen(ch);
    int nod=1;

    for(int i=0;i<len;i++)
    {
        nod=a[nod].fiu[ch[i]-'a'];
        a[nod].ap--;
    }
    a[nod].sf--;

    nod=1;
    int keep;
    for(int i=0;i<len;i++)
    {
        keep=a[nod].fiu[ch[i]-'a'];
        if(a[keep].ap==0)
        {
            delq.push_back(keep);
            a[nod].fiu[ch[i]-'a']=0;
        }
        nod=keep;
    }
}

void q1()
{
    int len=strlen(ch);
    int nod=1;

    for(int i=0;i<len;i++)
    {
        nod=a[nod].fiu[ch[i]-'a'];
    }

    res=a[nod].sf;
}

void q2()
{
    int len=strlen(ch);
    int nod=1;
    res=0;

    for(int i=0;i<len;i++)
    {
        if(a[nod].fiu[ch[i]-'a']!=0)
        {
            res++;
            nod=a[nod].fiu[ch[i]-'a'];
            if(a[nod].ap==0)
            {
                res--;
                break;
            }
        }
        else
        {
            break;
        }
    }
}

int main()
{
    freopen("trie.in","r",stdin);
    freopen("trie.out","w",stdout);

    while(!feof(stdin))
    {
        scanf("%d %s",&type,ch);
        if(type==0)
        {
            add();
        }
        else if(type==1)
        {
            del();
        }
        else if(type==2)
        {
            q1();
            printf("%d\n",res);
        }
        else
        {
            q2();
            printf("%d\n",res);
        }
    }
}