Cod sursa(job #2268455)

Utilizator pistvanPeter Istvan pistvan Data 24 octombrie 2018 20:42:30
Problema Trie Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.34 kb
#include <iostream>
#include <fstream>
//#include <string>
using namespace std;

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

struct Trie
{
    int num;
    Trie* children[26];
    Trie()
    {
        num=0;
        for (int i=0;i<26;i++)
            children[i]=NULL;
    }
};

Trie* root, *node;
int a;
string s;

int pos(char c)
{
    return c-'a';
}

void insert_word(string s)
{
    node=root;
    int i, bet;
    node->num++;
    for (i=0;i<s.size();i++)
    {
        bet=pos(s[i]);
        if (node->children[bet]==NULL)
        {
            node->children[bet]=new Trie();
        }
        node=node->children[bet];
        node->num++;
    }
}


void delete_word(string s)
{
    node=root;
    node->num--;
    int i, bet;
    for (i=0;i<s.size();i++)
    {
        bet=pos(s[i]);
        if (node->children[bet]==NULL)
            return;
        if (node->children[bet]->num==1)
            break;
        node=node->children[bet];
        node->num--;
    }
    if (i==s.size())
        return;
    Trie* tmp=node->children[bet], *nxt;
    node->children[bet]=NULL;
    for (i++;i<=s.size();i++)
    {
        bet=pos(s[i]);
        if (i==s.size())
        {
            delete tmp;
        }
        else
        {
            nxt=tmp->children[bet];
            delete tmp;
            tmp=nxt;
        }
    }

}

int find_word(string s)
{
    node=root;
    //cout<<" -- ";
    for (int i=0;i<s.size();i++)
    {
        if (node->children[pos(s[i])]==NULL)
            return 0;
        node=node->children[pos(s[i])];
    }
    int sum=0;
    for (int i=0;i<26;i++)
        if (node->children[i]!=NULL)
            sum+=node->children[i]->num;
    return node->num-sum;
}

int longest_prefix(string s)
{
    int len=0;
    node=root;
    for (int i=0;i<s.size();i++)
    {
        if (node->children[pos(s[i])]==NULL || node->children[pos(s[i])]->num==0)
            return len;
        len++;
        node=node->children[pos(s[i])];
    }
    return len;
}

int main()
{
    root=new Trie();

    while (f>>a)
    {
        f>>s;
        if (a==0)
            insert_word(s);
        if (a==1)
            delete_word(s);
        if (a==2)
            g<<find_word(s)<<'\n';
        if (a==3)
            g<<longest_prefix(s)<<'\n';
    }
}