Cod sursa(job #46346)

Utilizator mika17Mihai Alex Ionescu mika17 Data 2 aprilie 2007 16:17:10
Problema NextSeq Scor 55
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.69 kb
#include <stdio.h>
#include <string.h>
#define fin "nextseq.in"
#define fout "nextseq.out"
#define NMAX 10001
int S[NMAX],A[NMAX],B[NMAX],inda[NMAX],indb[NMAX],sol;

void read(int X[])
{
  int i;
  for(i=1;i<=X[0];++i)
  scanf("%d",&X[i]);
}

void add_zeroes(int X[],int x)    // X < Y
{
 memmove(&X[1+x],&X[1],sizeof(int)*X[0]);  //mutam X-1 poz
 memset(&X[1],0,sizeof(int)*x);
 X[0] +=x;
}

void readData()
{
 freopen(fin,"r",stdin);
 scanf("%d %d %d",&S[0],&A[0],&B[0]);
 read(S);
 read(A);
 read(B);
 fclose(stdin);
}

void qsort(int a[],int st,int dr)
{
 int i=st,j=dr,p=a[(st+dr)/2];
 while(i<j)
 {
  while(a[i]<p) ++i;
  while(a[j]>p) --j;
  if(i<=j)
  {
   int aux = a[i] ; a[i] = a[j] ; a[j] = aux;
   ++i; --j;
  }
 }
 if(st<j) qsort(a,st,j);
 if(i<dr) qsort(a,i,dr);
}

int bsearch(int X[],int st,int dr,int x)
{
 int step = 1,p = st;
 while(2 * step <= dr) step<<=1;
 for(;step;step>>=1)
 if(p + step <= dr & X[p]<x & X[p+step] <= x)
  p+=step;
 return p;
}

void get_ind(int X[],int I[])
{
 int i;
 I[0] = X[0];
 for(i=1;i<=X[0];++i)
  if(!X[i]) I[i] = 0;
   else I[i] = bsearch(S,1,S[0],X[i]);
}

int equal(int X[],int Y[])
{
 int i;
 for(i=1;i<=X[0];++i)
  if(X[i]!=Y[i]) return 0;
 return 1;
}

void solve()
{
 while(!equal(inda,indb))
 {
  inda[A[0]]++;
  for(int i = A[0] ; i>1 ;--i)
   if(inda[i]>S[0])
   {
    inda[i-1]++;
    inda[i] = 1;
   }
  ++sol;
 }
 --sol;
}


void writeData()
{
 freopen(fout,"w",stdout);
 printf("%d",sol);
 fclose(stdout);
}

int main()
{
 readData();
 add_zeroes(A,B[0]-A[0]);
 qsort(S,1,S[0]);
 get_ind(A,inda);
 get_ind(B,indb);
 solve();
 writeData();
 return 0;
}