Cod sursa(job #1729319)

Utilizator c0mradec0mrade c0mrade Data 14 iulie 2016 16:23:56
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#include<bits/stdc++.h>
#define T(x) (s[x]-'a')
using namespace std;
ifstream in("trie.in");
ofstream out("trie.out");

struct trie
{
    int pre, cuv;
    trie *a[26];
    trie()
    {
        pre=cuv=0;
        memset(a,0,sizeof(a));
    }
};

trie *root = new trie();

void add(string s)
{
    trie *p = root;
    for(int i=0;i<s.size();++i)
    {
        if (!p->a[T(i)])
            p->a[T(i)]=new trie;
        p=p->a[T(i)];
        p->pre++;
    }
    ++p->cuv;
}


void del(string s)
{
    trie *p=root;
    for(int i=0;i<s.size();++i)
    {
        p=p->a[T(i)];
        --p->pre;
    }
    --p->cuv;
}

int query(string s)
{
    trie *p=root;
    for(int i=0;i<s.size();++i)
    {
        if(p->a[T(i)])
            p=p->a[T(i)];
        else
            return 0;
    }
    return p->cuv;
}

int pre(string s)
{
    trie *p = root;
    int sol = 0;
    for(int i=0;i<s.size();++i)
    {
        if(!p->a[T(i)])
            return sol;
        p=p->a[T(i)];
        if(p->pre)
            ++sol;
    }
    return sol;

}

string s;
int x;
int main()
{
    while (in >> x >> s)
    {
        if (!x) add(s);
        if (x == 1) del(s);
        if (x == 2) out << query(s) << "\n";
        if (x == 3) out << pre(s) << "\n";
    }
    return 0;
}