Cod sursa(job #1278709)

Utilizator cdascaluDascalu Cristian cdascalu Data 29 noiembrie 2014 11:46:12
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.73 kb
#include<stdio.h>
#include<string.h>
#include<iostream>
#define SIGMA 30
#define Nmax 25
using namespace std;

struct node
{
    node()
    {
        nr = total = 0;
        memset(children, NULL, sizeof(children));
    }

    int nr, total;
    node *children[SIGMA];
};

void insert(node *p, char *s)
{
    ++p->total;
    if(*s == '\n' || *s == NULL)
    {
        ++p->nr;
        return;
    }

    int code = *s - 'a';

    if(p->children[code] == NULL)
        p->children[code] = new node();

    insert(p->children[code], s+1);
}

void remove(node *p, char *s)
{
    --p->total;
    if(*s == '\n' || *s == NULL)
    {
        --p->nr;
        return;
    }

    int code = *s - 'a';
    remove(p->children[code], s+1);
}

int count(node *p, char *s)
{
    if(*s == '\n' || *s == NULL)
    {
        return p->nr;
    }

    int code = *s - 'a';
    if(p->children[code] == NULL)
        return 0;

    return count(p->children[code], s+1);
}

int prefix(node *p, char *s)
{
    if(*s == '\n' || *s == NULL)
        return 0;

    int code = *s - 'a';
    if(p->children[code] == NULL || p->children[code]->total == 0)
        return 0;

    return 1 + prefix(p->children[code], s+1);
}

void solve(node *R)
{
    FILE*f = fopen("trie.in", "r");
    FILE*g = freopen("trie.out", "w", stdout);
    char p[25];
    int cnt = 0;
    while(!feof(f))
    {
        fgets(p, Nmax, f);

        if(feof(f))
            continue;
        if(p[0] == '0')
            insert(R, p+2);
        else if(p[0] == '1')
            remove(R, p+2);
        else if(p[0] == '2')
            cout<<count(R, p+2)<<"\n";
        else if(p[0] == '3')
            cout<<prefix(R, p+2)<<"\n";
    }

    fclose(f);
}
int main()
{
    node *R = new node;
    solve(R);

    return 0;
}