Cod sursa(job #1581962)

Utilizator delta_wolfAndrei Stoica delta_wolf Data 27 ianuarie 2016 14:27:38
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.47 kb
#include <cstdio>
#include<cstring>
using namespace std;
int p,n;
char s[22];
struct trie
{
    int words,prefix;
    trie *sons[26];
    trie()
    {
        words=prefix=0;
        memset(sons,0,sizeof(sons));
    }

}*triee;
void add_word(char s[])
{
    trie *q=triee;
    triee->prefix++;
    for(int i=0;i<n;i++)
    {
        if(q->sons[s[i]]==0)
            q->sons[s[i]]=new trie;
        q=q->sons[s[i]];
        q->prefix++;
    }
    q->words++;
}
void delete_word(char s[])
{
    trie *q=triee;
    triee->prefix--;
    for(int i=0;i<n;i++)
    {
        q=q->sons[s[i]];
        q->prefix--;
    }
    q->words--;
}
int words(char s[])
{
    trie *q=triee;
    for(int i=0;i<n;i++)
    {
        if(q->sons[s[i]]==0)return 0;
        q=q->sons[s[i]];
    }
    return q->words;

}
int prefix(char s[])
{
    trie *q=triee;
    for(int i=0;i<n;i++)
    {
        if(q->sons[s[i]]==0||q->sons[s[i]]->prefix==0)return i;
        q=q->sons[s[i]];
    }
    return n;
}
int main()
{
    freopen("trie.in","r",stdin);
    freopen("trie.out","w",stdout);
    triee=new trie;
    while(scanf("%d %s",&p,&s)!=EOF)
    {
        n=strlen(s);
        for(int i=0;i<n;i++)
            s[i]-='a';
        if(p==0)
            add_word(s);
        else if(p==1)
            delete_word(s);
        else if(p==2)
            printf("%d\n",words(s));
        else
            printf("%d\n",prefix(s));

    }
    return 0;
}