Cod sursa(job #2268447)

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

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

Trie* root;

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

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


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

}

int find_word(string s)
{
    Trie* 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;
    Trie* 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()
{
    ifstream f("trie.in");
    ofstream g("trie.out");
    string s;
    int a;
    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';
    }
}