Cod sursa(job #1096929)

Utilizator kiralalaChitoraga Dumitru kiralala Data 2 februarie 2014 18:56:28
Problema Trie Scor 5
Compilator cpp Status done
Runda Arhiva educationala Marime 1.93 kb
#include <fstream>
#include <cstring>
#include <stack>

using namespace std;

FILE* f=freopen("trie.in","r",stdin);
FILE* o=freopen("trie.out","w",stdout);

struct Node
{
    int n,nrs;
    Node* sons[27];
    Node()
    {
        n=nrs=0;
        memset(sons,0,sizeof(sons));
    }
} Trie;

void Insert(char w[])
{
    int l=strlen(w);
    Node *t=&Trie;
    for(int i=0;i<l;++i)
    {
        int ind=w[i]-'a';
        if(t->sons[ind]==0)
            t->sons[ind]=new Node,t->nrs+=1;
        t=t->sons[ind];
    }
    t->n+=1;
}

void Delete(char w[])
{
    int l=strlen(w);
    Node *t=&Trie;
    stack<Node*> stk;
    for(int i=0;i<l;++i)
    {
        int ind=w[i]-'a';
        t=t->sons[ind];
        stk.push(t);
    }
    t->n-=1;
    if(t->n==0&&t->nrs==0)
    {
        while(!stk.empty()&&t->n==0&&t->nrs<=1)
        {
            l-=1;
            delete(t);
            stk.pop();
            t=stk.top();
            t->sons[w[l]-'a']=0;
        }
        t->nrs-=1;
    }
}

int NumberOfOcurences(char w[])
{
    int l=strlen(w);
    Node *t=&Trie;
    for(int i=0;i<l&&t;++i)
    {
        int ind=w[i]-'a';
        t=t->sons[ind];
    }
    if(!t) return 0;
    return t->n;
}

int LongestPrefix(char w[])
{
    int l=strlen(w);
    Node *t=&Trie;
    int i;
    for(i=0;i<l&&t;++i)
    {
        int ind=w[i]-'a';
        t=t->sons[ind];
    }

    return i-1;
}

int main()
{
    int n;

    while(scanf("%d",&n)!=EOF)
    {
        char w[25];
        scanf(" %s",w);

        switch(n)
        {
            case 0:
                Insert(w);
            break;
            case 1:
                Delete(w);
            break;
            case 2:
                printf("%d\n",NumberOfOcurences(w));
            break;
            case 3:
                printf("%d\n",LongestPrefix(w));
            break;
        }
    }

    return 0;
}