Cod sursa(job #1377473)

Utilizator maribMarilena Bescuca marib Data 5 martie 2015 22:06:47
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.2 kb
#include <fstream>
#include <cstring>
using namespace std;

int lung, res, tip;

char sir[25], com;

struct trie
{
    int count, son;
    trie *fiu[26];

    trie ()
    {
        count=0; son=0;
        for(int i=0; i<26; ++i)
            fiu[i]=0;
    }
};

trie *root = new trie;

void insert(trie *node, int poz)
{
    if(poz==lung)
    {
        node -> count ++;
    }
    else
    {
        int x=(int)sir[poz]-97;
        if(!(node -> fiu[x]))
        {
            node -> fiu[x] = new trie;
            node -> son ++;
        }
        insert(node -> fiu[x], poz+1);
    }

}

int sterge(trie *node, int poz)
{
    if(poz==lung)
    {
        node -> count--;
    }
    else
    {
        int x=(int)sir[poz]-97;
        short deleted;
        deleted=sterge(node->fiu[x], poz+1);
        if(deleted)
        {
            node->son--;
            node->fiu[x]=0;
        }
    }
    if(!(node -> count)&&node!=root&&!(node->son))
    {
        delete node;
        return 1;
    }
    return 0;
}

int afisare(trie *node, int poz)
{
    if(poz==lung)
    {
        return node->count;
    }
    else
    {
        int x = (int)sir[poz]-97;
        if(node->fiu[x])
            return afisare(node->fiu[x], poz+1);
        return 0;
    }
}

void longest_prefix(trie *node, int poz)
{
    if(poz<lung)
    {
        int x=(int)sir[poz]-97;
        if( node -> fiu[x])
        {
            res++;
            longest_prefix(node -> fiu[x], poz+1);
        }
    }
}
int main()
{
    ifstream in("trie.in");
    ofstream out("trie.out");
    while(!in.eof())
    {
        com=in.get();
        in.get();
        in.get(sir, 20);
        lung=strlen(sir);
        in.get();
        tip=(int)com-48;
        if(tip==0)
        {
            insert(root, 0);
        }
        else if(tip==1)
        {
            sterge(root, 0);
        }
        else if(tip==2)
        {
            out<<afisare(root, 0)<<"\n";
        }
        else if(tip==3)
        {
            res=0;
            longest_prefix(root, 0);
            out<<res<<"\n";
        }
    }
    in.close();
    out.close();
    return 0;
}