Cod sursa(job #1893268)

Utilizator mateigabriel99Matei Gabriel mateigabriel99 Data 25 februarie 2017 16:20:17
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 kb
#include <bits/stdc++.h>

using namespace std;

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

int N;
struct Trie { int nrFii,fii[26],cnt; };
vector<Trie> T;
Trie x;

void New()
{
    T.push_back(x);
}

void Add(char *cuv,int nod)
{
    if(*cuv=='\0')
    {
        T[nod].cnt++;
        return;
    }
    int l=*cuv-'a',poz;
    if(T[nod].fii[l]==0)
    {
        T[nod].nrFii++;
        New();
        poz=T[nod].fii[l]=T.size()-1;
    }
    else
        poz=T[nod].fii[l];
    Add(cuv+1,poz);
}

void Delete(char *cuv,int nod)
{
    if(*cuv=='\0')
    {
        T[nod].cnt--;
        return;
    }
    int l=*cuv-'a';
    int fiu=T[nod].fii[l];
    Delete(cuv+1,fiu);
    if(T[fiu].cnt==0 && T[fiu].nrFii==0)
        T[nod].nrFii--, T[nod].fii[l]=0;
}

int NrCuv(int nod,char *cuv)
{
    if(*cuv=='\0')
        return T[nod].cnt;
    int l=*cuv-'a';
    int fiu=T[nod].fii[l];
    if(T[nod].fii[l]==0)
        return 0;
    return NrCuv(fiu,cuv+1);
}

int LungimePrefix(int nod,char *cuv,int k)
{
    int l=*cuv-'a';
    if(*cuv=='\0' || T[nod].fii[l]==0)
        return k;
    return LungimePrefix(T[nod].fii[l],cuv+1,k+1);
}
int main()
{
    New();
    int op; char c[100];
    while(fin>>op>>c)
    {
        if(op==0)   Add(c,0);
        if(op==1)   Delete(c,0);
        if(op==2)   fout<<NrCuv(0,c)<<"\n";
        if(op==3)   fout<<LungimePrefix(0,c,0)<<"\n";
    }
    return 0;
}