Cod sursa(job #1070908)

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