Cod sursa(job #2010398)

Utilizator victoreVictor Popa victore Data 12 august 2017 22:12:04
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.83 kb
#include<cstdio>
#include<cstring>

using namespace std;

struct Trie
{
    Trie *fii[30];
    int nrfii;
    int nrcuv;
    Trie()
    {
        nrfii=nrcuv=0;
        memset(fii,0,sizeof(fii));
    }
};

Trie *mainroot = new Trie;

inline int gn(char ch)
{
    return ch-'a';
}

inline void add(Trie *root , char *s)
{
    int n=strlen(s),i;
    for(i=0;i<n;root=root->fii[gn(s[i++])])
        if(root->fii[gn(s[i])] == 0)
        {
            root->fii[gn(s[i])] = new Trie;
            root->nrfii++;
        }

    root->nrcuv++;
}

inline int frecv(Trie *root , char *s)
{
    int n=strlen(s),i;
    for(i=0;i<strlen(s);root = root->fii[gn(s[i++])])
        if(root->fii[gn(s[i])] == 0)
            return 0;
    return root->nrcuv;
}

inline int compref(Trie *root , char *s)
{
    int n=strlen(s),i;
    for(i=0;i<n;root=root->fii[gn(s[i++])])
        if(root->fii[gn(s[i])]==0)
            return i;
    return n;
}

inline bool del(Trie *root,char *s)
{
    if(*s == 0 )
    {
        root->nrcuv--;
        if(root->nrcuv == 0  && root->nrfii == 0)
            return 1;
        return 0;
    }
    if(root->fii[*s-'a'] == 0)
        return false;
    if(del(root->fii[*s-'a'],s+1))
    {
        delete root->fii[*s-'a'];
        root->fii[*s-'a'] = NULL;
        root->nrfii--;
    }
    if(root->nrcuv==0 && root->nrfii == 0)
        return 1;
    return 0;
}

char s[30];

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

    while(scanf("%d ",&op) != EOF)
    {
        gets(s);
        if(op==0)
            add(mainroot,s);
        else if(op==1)
            del(mainroot,s);
        else if(op==2)
            printf("%d\n",frecv(mainroot,s));
        else
            printf("%d\n",compref(mainroot,s));
    }
}