Cod sursa(job #1922016)

Utilizator KimerthSilviu Motfolea Kimerth Data 10 martie 2017 15:42:51
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.32 kb
#include <iostream>
#include <fstream>
#include <queue>
#include <string>

using namespace std;

ifstream fin("trie.in");
ofstream fout("trie.out");

struct Trie
{
    int word_count;
    int prefix_count;
    Trie* edges[26];
};

Trie* trie;

void InitTrie(Trie* vertex)
{
    vertex->word_count = 0;
    vertex->prefix_count = 0;
    for(int i = 0; i < 26; i++)
        vertex->edges[i] = NULL;
}

void ModifyWord(Trie* &vertex, queue<char> word, int val)
{
    if(word.empty())
    {
        vertex->word_count += val;
        if(vertex->word_count == 0)
        {
            delete vertex;
            vertex = NULL;
        }
        return;
    }

    vertex->prefix_count += val;
    int cur_edge = word.front() - 'a';
    if(vertex->edges[cur_edge] == NULL)
    {
        vertex->edges[cur_edge] = new Trie;
        InitTrie(vertex->edges[cur_edge]);
    }

    word.pop();
    ModifyWord(vertex->edges[cur_edge], word, val);
}

int NrWords(Trie* vertex, queue<char> word)
{
    if(word.empty())
        return vertex->word_count;
    int cur_edge = word.front() - 'a';
    word.pop();
    if(vertex->edges[cur_edge] == NULL)
        return 0;

    return NrWords(vertex->edges[cur_edge], word);
}

int LongestPrefix(Trie* vertex, queue<char> word)
{
    if(word.empty())
        return 1;

    int v = word.front() - 'a';
    for(int i = 0; i < 26; i++)
        if(i != v && vertex->edges[v] != NULL && vertex->edges[i] != NULL)
    {
        word.pop();
        return 1 + LongestPrefix(vertex->edges[v], word);
    }
    return 0;
}

int main()
{
    trie = new Trie;
    InitTrie(trie);
    while(!fin.eof())
    {
        int o = 4;
        char s[20];
        queue<char> word;
        fin >> o >> s;
        for(int i = 0; i < 20; i++)
            if(s[i] != '\0')
                word.push(s[i]);
            else
                break;

        switch(o)
        {
        case 0:
            ModifyWord(trie, word, 1);
            break;
        case 1:
            ModifyWord(trie, word, -1);
            break;
        case 2:
            fout << NrWords(trie, word) << '\n';
            break;
        case 3:
            fout << LongestPrefix(trie, word) << '\n';
            break;
        default:
            break;
        }
    }
}