Cod sursa(job #1520915)

Utilizator ArchazeyBaltatu Andrei-Mircea Archazey Data 9 noiembrie 2015 18:21:51
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include<bits/stdc++.h>
using namespace std;

struct Trie
{
    int ap,frecv;
    Trie *t[26];
    Trie()
    {
        ap=frecv=0;
        for (int i=0;i<26;i++) t[i]=NULL;
    }
};

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

int n,cnt;
char s[25];
Trie *root=new Trie();

void Add(Trie *p,int poz)
{
    if (poz>1) p->frecv++;
    if (poz==n+1)
    {
        p->ap++;
        return;
    }
    if (p->t[s[poz]-'a']==NULL) p->t[s[poz]-'a']=new Trie();
    Add(p->t[s[poz]-'a'],poz+1);
}

void Sub(Trie *p,int poz)
{
    if (poz>1) p->frecv--;
    if (poz==n+1)
    {
        p->ap--;
        return;
    }
    Sub(p->t[s[poz]-'a'],poz+1);
}

int Cate(Trie *p,int poz)
{
    if (poz==n+1) return p->ap;
    if (p->t[s[poz]-'a']==NULL) return 0;
    Cate(p->t[s[poz]-'a'],poz+1);
}

void Pref(Trie *p,int poz)
{
    if (poz==n+1 || p->t[s[poz]-'a']==NULL) return ;
    if (p->t[s[poz]-'a']->frecv==0) return;
    cnt++;
    Pref(p->t[s[poz]-'a'],poz+1);
}

int main()
{
    int i,op;
    while (fin>>op)
    {
        fin>>(s+1);
        n=strlen(s+1);
        if (op==0) Add(root,1);
        if (op==1) Sub(root,1);
        if (op==2) fout<<Cate(root,1)<<"\n";
        if (op==3) {cnt=0;Pref(root,1);fout<<cnt<<"\n";}
    }
    return 0;
}