Cod sursa(job #1888290)

Utilizator alex.jilavu17alex jilavu alex.jilavu17 Data 22 februarie 2017 00:24:03
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.76 kb
#include <fstream>
#include <string.h>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
char s[25];
int n,op;
struct tri{
    int cuv,pref;
    tri *fii[27];
    tri(){
        cuv=pref=0;
        memset(fii,0,sizeof(fii));}
}*trie;

void add(char s[]){
    tri *q=trie;
    trie->pref++;
    for(int i=0;i<n;i++){
        if(q->fii[s[i]]==0)
            q->fii[s[i]]=new tri;
        q=q->fii[s[i]];
        q->pref++;
    }
    q->cuv++;}

int cuv(char s[]){
    tri *q=trie;
    for(int i=0;i<n;i++){
        if(q->fii[s[i]]==0)
            return 0;
        q=q->fii[s[i]];
    }
    return q->cuv;}
int pref(char s[]){
    tri *q=trie;
    for(int i=0;i<n;i++){
        if(q->fii[s[i]]==0 || (q->fii[s[i]]->pref==0))
            return i;
        q=q->fii[s[i]];
    }
    return n;}
void del(char s[]){
    tri *q=trie;
    trie->pref--;
    for(int i=0;i<n;i++)
    {
        q=q->fii[s[i]];
        q->pref--;
    }
    q->cuv--;
}
int main(){
    trie=new tri;
    while(fin>>op,fin.get(),fin.get(s,25,'\n')){
        fin.get();
        n=strlen(s);
        for(int i=0;i<n;i++)
            s[i]-='a';
        if(op==0)
            add(s);
        if(op==1)
            del(s);
        if(op==2)
            fout<<cuv(s)<<'\n';
        if(op==3)
            fout<<pref(s)<<'\n';}
    return 0;}
/*
#include <cstdio>
#include<cstring>
using namespace std;
int n,op;
char s[25];
struct tri
{
    int cuv, pref;
    tri *fii[27];
    tri()
    {
        cuv=pref=0;
        memset(fii,0,sizeof(fii));
    }

}*trie;


void add(char s[])
{
    tri *q=trie;
    trie->pref++;
    for(int i=0;i<n;i++)
    {
        if(q->fii[s[i]]==0)
            q->fii[s[i]]=new tri;
        q=q->fii[s[i]];
        q->pref++;
    }
    q->cuv++;
}

int cuv(char s[])
{
    tri *q=trie;
    for(int i=0;i<n;i++)
    {
        if(q->fii[s[i]]==0)return 0;
        q=q->fii[s[i]];
    }
    return q->cuv;
}

int pref(char s[])
{
    tri *q=trie;
    for(int i=0;i<n;i++)
    {
        if(q->fii[s[i]]==0||(q->fii[s[i]]->pref==0))return i;
        q=q->fii[s[i]];
    }
    return n;
}

void del(char s[])
{
    tri *q=trie;
    trie->pref--;
    for(int i=0;i<n;i++)
    {
        q=q->fii[s[i]];
        q->pref--;
    }
    q->cuv--;
}

int main()
{
    freopen("trie.in","r",stdin);
    freopen("trie.out","w",stdout);

    trie= new tri;

    while(scanf("%d %s",&op,&s)!=EOF)
    {
        n=strlen(s);
        for(int i=0;i<n;i++)
            s[i]-='a';
        if(op==0)
            add(s);
        else if(op==1)
            del(s);
        else if(op==2)
            printf("%d\n",cuv(s));
        else printf("%d\n",pref(s));
    }
    return 0;
}
*/