Cod sursa(job #2205271)

Utilizator PushkinPetolea Cosmin Pushkin Data 18 mai 2018 17:21:14
Problema Trie Scor 65
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include <iostream>
#include <bits/stdc++.h>
#include <fstream>
#include <cstring>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
struct nod
{
    int nrf;
    int ct;
    nod *urm[26];
    nod()
    {
        memset(urm, 0, sizeof(urm));
        nrf=0;
        ct=0;
    }
}*T=new nod();
void add(string s)
{
    int i;
    nod *t=T;
    for(auto a:s)
    {
        t->nrf++;
        i=a-'a';
        if(!t->urm[i])
            t->urm[i]=new nod();
        t=t->urm[i];
    }
    t->ct++;
}
int pref(string s)
{
    int i, p=0;
    nod *t=T;
    for(auto a:s)
    {
        i=a-'a';
        if(!t->urm[i]||!(t->urm[i]->ct||t->urm[i]->nrf))
            break;
        t=t->urm[i];
        p++;
    }
    return p;
}
void cut(string s)
{
    int i;
    nod *t=T;
    for(auto a:s)
    {
        t->nrf--;
        if(t->nrf==0)
        {
            t=0;
            return;
        }
        i=a-'a';
        if(!t->urm[i])
            break;
        t=t->urm[i];
    }
    t->ct--;
}
int nrap(string s)
{
    int i;
    nod *t=T;
    for(auto a:s)
    {
        i=a-'a';
        if(!t->urm[i])
            return 0;
        t=t->urm[i];
    }
    return t->ct;
}
int main()
{
    int op;
    string s;
    while(f>>op>>s)switch(op)
    {
        case 0:add(s);break;
        case 1:cut(s);break;
        case 2:g<<nrap(s)<<'\n';break;
        case 3:g<<pref(s)<<'\n';break;
    }
    f.close();
    g.close();
    return 0;
}