Cod sursa(job #1989609)

Utilizator geo_furduifurdui geo geo_furdui Data 8 iunie 2017 10:33:56
Problema Trie Scor 45
Compilator cpp Status done
Runda Arhiva educationala Marime 2.27 kb
#include <fstream>
#include<cstring>
using namespace std;
ifstream cin ("trie.in");
ofstream cout ("trie.out");
char s[100100]; int frecv[100100]; int k,nodes,maxim=-1,tata[100100],grad[100100];
struct bla
{
    int nod; char c; int urm,start,nr;
} t[100100];
void adauga (int poz,int rad)
{
    for(int x=t[rad].start;x!=0;x=t[x].urm)
    {
        if(t[x].c==s[poz] && t[x].nod!=-1)
        {
            if(poz==strlen(s)-1) t[x].nr++,frecv[t[x].nod]++;
            else adauga(poz+1,t[x].nod);
            return;
        }
    }
    nodes++; grad[rad]++;
    t[nodes].nod=nodes; t[nodes].urm=t[rad].start; t[rad].start=nodes; t[nodes].c=s[poz]; tata[nodes]=rad;
    if(poz==strlen(s)-1) t[nodes].nr++;
    else adauga(poz+1,nodes);
}
void verif (int varf)
{
    if(frecv[varf]!=0) return;
    if(grad[varf]>1) return;
    if(varf==0) return;
    int rad=tata[varf];
    for(int x=t[rad].start;x!=0;x=t[x].urm)
    {
        if(t[x].nod==varf) {t[x].nod=-1;grad[tata[varf]]--; break;}
    }
    verif(tata[varf]);
}
void sterge (int poz,int rad)
{
    for(int x=t[rad].start;x!=0;x=t[x].urm)
    {
        if(t[x].c==s[poz])
        {
            if(poz==strlen(s)-1) {t[x].nr--; frecv[t[x].nod]--; verif(t[x].nod);}
            else sterge(poz+1,t[x].nod);
            return;
        }
    }
}
void answare (int poz,int rad)
{
    for(int x=t[rad].start;x!=0;x=t[x].urm)
    {
        if(t[x].c==s[poz] && t[x].nod!=-1)
        {
            if(poz==strlen(s)-1) cout<<t[x].nr<<"\n";
            else answare(poz+1,t[x].nod);
            return;
        }
    }
    cout<<0<<"\n";
}
void answare_again (int poz,int rad)
{
    for(int x=t[rad].start;x!=0;x=t[x].urm)
    {
        if(t[x].c==s[poz] && t[x].nod!=-1)
        {
            if(t[x].c==s[poz]) maxim=max(maxim,poz);
            if(poz==strlen(s)-1) return;
            else
            answare_again(poz+1,t[x].nod);
        }
    }
}
void read ()
{ int p;
    while(cin>>p)
    {
        cin>>s;
        if(p==0) adauga(0,0);
        else if(p==1) sterge(0,0);
        else if(p==2) answare(0,0);
        else if(p==3) {answare_again(0,0); cout<<maxim+1<<"\n"; maxim=-1; }
    }
}
int main()
{
    read();
    cin.close();
    cout.close();
    return 0;
}