Cod sursa(job #2166864)

Utilizator MentaPopa Marius-Catalin Menta Data 13 martie 2018 19:15:35
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2 kb
#include <bits/stdc++.h>


using namespace std;

const int alfbet = 26;

ifstream f("trie.in");
ofstream g("trie.out");

struct TrieNode
{
    int nr;
    int fii;
    struct TrieNode *next[alfbet];

    TrieNode ()
    {
        nr = 0;
        fii = 0;
        memset(next, NULL, sizeof(next));
    }
};

TrieNode *t = new TrieNode;

void TrieInsert ( TrieNode *root , char s[] )
{
    TrieNode *p = root;
    for (int i = 0 ; i < strlen(s) ; i++)
    {
        int index = s[i] - 'a';
        if( !p->next[index])
        {
            p->next[index] = new TrieNode;
            p->fii++;
        }
        p = p->next[index];
    }
     p->nr++;
}

int TrieDelete ( TrieNode *root, char *s )
{
    TrieNode *p = root;
    int index = *s - 'a';
    if ( *s == NULL)
        p->nr--;
    else if (TrieDelete( p->next[index] , s + 1))
    {
        p->next[index] = NULL;
        p->fii--;
    }
    if( p->nr == 0 && p->fii == 0 && p != t )
    {
        delete p;
        return 1;
    }
    return 0;
}

int TrieSearch( TrieNode *root, char s[])
{
    TrieNode *p = root;
    for( int i = 0 ; i < strlen(s) ; i++)
    {
        int index = s[i] - 'a';
        if(!p->next[index])
            return 0;

            p = p->next[index];
    }
    return p->nr;
}


int TriePre( TrieNode *root, char s[])
{
    int i;
    TrieNode *p = root;
    for(i = 0 ; i < strlen (s); i++ )
    {
        int index = s[i] - 'a';
        if( p ->next[index] == NULL )
            return i;
        p = p->next[index];
    }
    return i;
}



int n, op;
char word[21];

int main()
{
    while(f>>op>>word)
    {
       switch (op)
        {
        case 0:
            TrieInsert(t , word);
            break;
       case 1:
            TrieDelete(t, word);
            break;
        case 2:
            g<<TrieSearch(t, word)<<"\n";
            break;
        case 3:
            g<<TriePre(t, word)<<"\n";
            break;
        }
    }
}