Cod sursa(job #1306090)

Utilizator bence21Bako Bence bence21 Data 30 decembrie 2014 15:24:39
Problema Trie Scor 35
Compilator cpp Status done
Runda Arhiva educationala Marime 3.36 kb
#include<fstream>
#include<string.h>
using namespace std;
int main()
{
    ifstream f("trie.in");
    ofstream g("trie.out");
    int v;
    char x[20],t[50000][20];
    int d[100000];
    long i,n=0,j,k,y,m;
    while(!f.eof())
    {
        f>>v>>x;
        if(v==0)
        {
            if(n==0)
            {
                d[n]++;
                strcpy(t[n++],x);
            }
            else{
                i=0;
                j=n-1;
                bool jo=0;
                while(i<=j)
                {
                    k=(i+j)/2;
                    y=strcmp(t[k],x);
                    if(y>0)
                        j=k-1;
                    else if(y<0)
                        i=k+1;
                    else {
                        jo=1;
                        d[k]++;
                        i=j+1;
                    }
                }
                if(jo==0)
                {
                    for(j=n;j>i;j--)
                    {
                        strcpy(t[j],t[j-1]);
                        d[j]=d[j-1];
                    }
                    d[i]=1;
                    strcpy(t[i],x);
                    n++;
                }
            }
        }
        else if(v==1)
        {
            i=0;
            j=n-1;
            while(i<=j)
            {
                k=(i+j)/2;
                y=strcmp(t[k],x);
                if(y>0)
                    j=k-1;
                else if(y<0)
                    i=k+1;
                else {
                    d[k]--;
                    if(d[k]==0)
                    {
                        for(j=k;j<n-1;j++)
                        {
                            strcpy(t[j],t[j+1]);
                            d[j]=d[j+1];
                        }
                        n--;
                    }
                    i=j+1;
                }
            }
        }
        else if(v==2)
        {
            i=0;
            j=n-1;
            bool jo=0;
            while(i<=j)
            {
                k=(i+j)/2;
                y=strcmp(t[k],x);
                if(y>0)
                    j=k-1;
                else if(y<0)
                    i=k+1;
                else {
                    i=j+1;
                    jo=1;
                }
            }
            if(jo==1)
                g<<d[k]<<"\n";
            else g<<"0\n";
        }
        else
        {
            i=0;
            j=n-1;
            bool jo=0;
            while(i<=j)
            {
                k=(i+j)/2;
                y=strcmp(t[k],x);
                if(y>0)
                    j=k-1;
                else if(y<0)
                    i=k+1;
                else {
                    jo=1;
                    g<<strlen(x)<<"\n";
                    i=j+1;
                }
            }
            if(jo==0)
            {
                m=0;
                while(t[k][m]==x[m])m++;
                k--;
                y=0;
                while(t[k][y]==x[y])y++;
                if(y>m)
                    m=y;
                y=0;
                k=k+2;
                while(t[k][y]==x[y])y++;
                if(y>m)
                    m=y;
                g<<m<<"\n";
            }
        }
    }
    f.close();
    g.close();
    return 0;
}