Cod sursa(job #2287469)

Utilizator cc4infinityCojocaru Catalin cc4infinity Data 21 noiembrie 2018 21:52:10
Problema Trie Scor 5
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.9 kb
#include <bits/stdc++.h>

using namespace std;

struct trie
{
    struct trie *copil[30];
    int eow;
    int rang;
    trie()
    {
        rang=0;
        eow=0;
        for (int i=0;i<=27;i++)
        copil[i]=NULL;
    }
};

/*struct trie *creaza(void)
{
    struct trie  *tnode=new trie;
    tnode->rang=0;
    tnode->eow=0;
    for (int i=0;i<=27;i++)
        tnode->copil[i]=NULL;
    return tnode;
};*/



void insert(string s,trie *curent)
{
    for (int i=0;i<s.size();i++)
    {
        int n=s[i]-'a';
        if (!curent->copil[n])
            curent->copil[n]=new trie;
        curent->rang++;
        curent=curent->copil[n];
    }
    curent->eow++;
}

int apare(string s,trie *curent)
{
    for (int i=0;i<s.size();i++)
    {
        int n=s[i]-'a';
        if (!curent->copil[n])
            return 0;
        curent=curent->copil[n];
    }
    return curent->eow;
}

int pref(string s,trie *curent)
{
    for (int i=0;i<s.size();i++)
    {
        int n=s[i]-'a';
        if (!curent->copil[n])
            return i;
        curent=curent->copil[n];
    }
    return s.size();
}

bool sterge(string s,int l,struct trie *nod)
{
    if (l==s.size())
    {
        nod->eow--;
        if (nod->rang) return 0; else return 1;
    }
    int n=s[l]-'a';
    if (sterge(s,l+1,nod->copil[n]))
    {
        nod->copil[n]=NULL;
        if (nod->eow) {nod->rang--; return 0;}
        if (nod->rang>1) {nod->rang--; return 0;}
        return 1;
    }
}

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

int i,j,m,n,a,b;
string s;
trie *root=new trie;
int main()
{
    while (!fin.eof())
    {
        fin>>i>>s;
        if (fin.eof()) break;
        if (i==0) insert(s,root);
        if (i==1) b=sterge(s,0,root);
        if (i==2) fout<<apare(s,root)<<"\n";
        if (i==3) fout<<pref(s,root)<<"\n";
    }
    return 0;
}