Cod sursa(job #1070940)

Utilizator Daniel3717Aleca Daniel Adrian Daniel3717 Data 2 ianuarie 2014 12:46:26
Problema Trie Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.58 kb
#include <iostream>
#include <fstream>
using namespace std;
struct trie{
int nfii,val;
trie *fii[26];
trie()
{
    nfii=0;
    val=0;
    for (int i=0;i<26;i++)
        fii[i]=NULL;
}
} *rad;
string s;
void query0()
{
    trie *p;
    p=rad;
    for (int i=2;i<s.size();i++)
    {
        if (p->fii[s[i]-'a']==NULL)
        {
            p->fii[s[i]-'a']=new(trie);
            p->nfii++;
        }
        p=p->fii[s[i]-'a'];
    }
    p->val++;
}
int query1(trie *p,int pos)
{
    if (pos==s.size())
        p->val--;
    else
        if (query1(p->fii[s[pos]-'a'],pos+1)==0)
        {
            p->fii[s[pos]-'a']=NULL;
            p->nfii--;

        }
    if ((p->nfii==0)&&(p->val==0))
    {
        delete(p);
        return 0;
    }
    else
        return 1;
}
int query2()
{
    trie *p;
    p=rad;
    for (int i=2;i<s.size();i++)
    {
        if (p->fii[s[i]-'a']==NULL)
            return 0;
        p=p->fii[s[i]-'a'];
    }
    return p->val;
}
int query3()
{
    trie *p;
    p=rad;
    for (int i=2;i<s.size();i++)
    {
        if (p->fii[s[i]-'a']==NULL)
            return i-2;
        p=p->fii[s[i]-'a'];
    }
    int sz=s.size();
    return sz-2;
}
int main(void)
{
    ifstream f("trie.in");
    ofstream g("trie.out");
    rad=new(trie);
    while (getline(f,s))
    {
        if (s[0]-'0'==0)
            query0();
        if (s[0]-'0'==1)
            query1(rad,2);
        if (s[0]-'0'==2)
            g<<query2()<<'\n';
        if (s[0]-'0'==3)
            g<<query3()<<'\n';
    }
    return 0;
}