Cod sursa(job #2173788)

Utilizator mrhammerCiocan Cosmin mrhammer Data 16 martie 2018 01:21:39
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.66 kb
#include<iostream>
#include<fstream>
#include <cstdio>
#include <cstring>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct trie
{
    int w_cnt;
    int t_cnt;
    trie *t[26];
    trie()
    {
        w_cnt = 0;
        t_cnt = 0;
        memset(t,0,sizeof(t));
    }
};
trie *t_node;
int char_to_int(char *c)
{
    return int(*c)-97;
}
void add_w(trie *it,char *s)
{
    if(*s == '\0')
    {
        it->w_cnt++;
        return;
    }
    int poz = char_to_int(s);
    if(it->t[poz] == 0) it->t[poz] = new trie,it->t_cnt++;
    add_w(it->t[poz],s+1);
}
int delete_w(trie *it,char *s)
{
    if(*s == '\0')
    {
        it->w_cnt--;
    }
    else if(delete_w(it->t[char_to_int(s)],s+1))
    {
        int poz = char_to_int(s);
        it->t[poz] = 0;
        it->t_cnt--;
    }
    if(it->t_cnt == 0 && it->w_cnt == 0 && it != t_node)
    {
        delete it;
        return 1;
    }
    return 0;
}
int w_query(trie *it,char *s)
{
    if(*s == '\0') return it->w_cnt;
    int poz = char_to_int(s);
    if(it->t[poz] != 0)
    {
        return w_query(it->t[poz],s+1);
    }
    return 0;
}
int prefix_query(trie *it,char *s,int k)
{
    if(*s == '\0' || it->t[char_to_int(s)] == 0) return k;
    return prefix_query(it->t[char_to_int(s)],s+1,k+1);
}
int main()
{
    t_node = new trie;
    int k1;
    char cuv[21];
    while(fin>>k1)
    {
        fin>>cuv;
        if(k1 == 0) add_w(t_node,cuv);
        else if(k1 == 1) delete_w(t_node,cuv);
        else if(k1 == 2) fout<<w_query(t_node,cuv)<<"\n";
        else if(k1 == 3) fout<<prefix_query(t_node,cuv,0)<<"\n";
    }
}