Cod sursa(job #1453525)

Utilizator rangerChihai Mihai ranger Data 23 iunie 2015 19:29:35
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include<fstream>
#include<string.h>
#include<string>
using namespace std;

ifstream cin("trie.in");
ofstream cout("trie.out");


struct trie
{
    int ishere, endhere;
    trie * a[26];

    trie ()
    {
        ishere=endhere=0;
        memset(a,0,sizeof(a));
    }
};

trie * root = new trie();
int n,typ;
string s;

void insereaza(string s)
{
    trie * p = root;
    for (int i=0;i<s.size();i++)
    {
        if (!p->a[s[i]-'a'])
            p->a[s[i]-'a'] = new trie();
        p=p->a[s[i]-'a']; p->ishere++;
    }
    p->endhere++;
}

void sterge(string s)
{
    trie * p = root;
    for (int i=0;i<s.size();i++)
        p = p->a[s[i]-'a'], p->ishere--;
    p->endhere--;
}

int query(string s)
{
    trie * p = root;
    for (int i=0;i<s.size();i++)
        if (p->a[s[i]-'a']) p=p->a[s[i]-'a'];
    else return 0;
    return p->endhere;
}


int prefix(string s)
{
    trie * p = root;
    int rs=0;
    for (int i=0;i<s.size();i++)
    {
        if (!p->a[s[i]-'a']) return rs;
        p=p->a[s[i]-'a'];
        if (p->ishere) rs=i+1;
    }
    return rs;
}

int main()
{
   while (cin>>typ>>s)
    {
        if (typ==0) insereaza(s);
        if (typ==1) sterge(s);
        if (typ==2) cout<<query(s)<<"\n";
        if (typ==3) cout<<prefix(s)<<"\n";
    }
    return 0;
}