Cod sursa(job #977540)

Utilizator crisbodnarCristian Bodnar crisbodnar Data 26 iulie 2013 07:27:24
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 kb
#include <iostream>
#include <fstream>
#include <cstring>

using namespace std;

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

struct trie{
    int p, fr; struct trie* f[26];
    trie(){ p=fr=0; memset(f,0,sizeof(f));}
}*t;

void Add(const string s)
{
    int n = s.length(), c;
    trie* x = t;
    for(int i=0; i<n; i++)
    {
        c = s[i] - 'a';
        if(!x->f[c]) x->f[c] = new trie();
        x = x->f[c];
        x->p++;
    }
    x->fr++;
}

void Erase(const string s)
{
    int n = s.length(), c;
    trie* x = t;
    for(int i=0; i<n; i++)
    {
        c = s[i] - 'a';
        x = x->f[c];
        x->p--;
    }
    x->fr--;
}

int Frequ(const string s)
{
    int n = s.length(), c;
    trie* x = t;
    for(int i=0; i<n; i++)
    {
        c = s[i] - 'a';
        if(!x->f[c]) return 0;
        x = x -> f[c];
    }
    return x->fr;
}

int Pref(const string s)
{
    int n = s.length(), c;
    trie* x = t;
    for(int i=0; i<n; i++)
    {
        c = s[i] - 'a';
        if(!x->f[c] || !x->f[c]->p) return i;
        x = x->f[c];
    }
    return n;
}

int main()
{
    int tip; string s;
    t = new trie();
    while(fin>>tip>>s)
    {
        if(!tip) Add(s); else
        if(tip == 1) Erase(s); else
        if(tip == 2) fout<<Frequ(s)<<'\n'; else
        fout<<Pref(s)<<'\n';
    }
    return 0;
}