Cod sursa(job #1989604)

Utilizator geo_furduifurdui geo geo_furdui Data 8 iunie 2017 10:15:05
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.35 kb
#include <fstream>
#include<cstring>
#include<iostream>
using namespace std;
ifstream g ("trie.in");
//ofstream cout ("trie.out");
ifstream f ("trie.out");
char s[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++;
            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(t[varf].start!=0) return;
    if(t[varf].nr!=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--; 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();
    int x,y,nr=0;
    while(g>>x)
    { nr++;
      f>>y;
      if(x!=y) cout<<nr<<"\n";
    }

    return 0;
}