Cod sursa(job #393273)

Utilizator doru.nituNitu Doru Constantin doru.nitu Data 9 februarie 2010 09:53:02
Problema NextSeq Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
#include<stdio.h>
#include<algorithm>
using namespace std;

int i,j,n,m,p,a[10010],in[10010],nr,l,x[10010],b[10010],ok,p1[10010];

int cautbin(int a)
{
	int st=1,dr=n,mij=0;
	
	while(st<=dr)
	{
		mij=(st+dr)/2;
		
		if(x[mij]==a) return mij;
		else if(a>x[mij]) st=mij+1;
		else dr=mij-1;
	}
	return 0;
}

int verifica(int l)
{
    //for(int i=1;i<=l;++i) printf("%d ",p1[i]);
	//printf("\n");
	
 	
	if(l-p) return 0;

	for(int i=1;i<=l;++i) if(b[i]-p1[i]) return 0;
	
	return 1;
}

void back1(int i)
{
	if(i>m) 
	{
		if(verifica(m)) 
		{
			ok=1;
			return;
		}
		++nr;
		return;
	}
	
	for(int j=in[i];j<=n&&!ok;++j)
	{
		p1[i]=x[j];
		back1(i+1);
		in[i]=1;
	}
}

void back(int i,int l)
{
	if(i>l)
	{  
		if(verifica(l))
		{
			ok=1;
			return;
		}
		++nr;
		return;
	}
	
	for(int j=1;j<=n&&!ok;++j)
	{
		p1[i]=x[j];
		back(i+1,l);
	}
}
		
	

int main()
{
	freopen("nextseq.in","r",stdin);
	freopen("nextseq.out","w",stdout);
	
	scanf("%d %d %d",&n,&m,&p);
	
	for(i=1;i<=n;++i)
		scanf("%d",&x[i]);
	
	sort(x+1,x+n+1);
	
	for(i=1;i<=m;++i)
	{
		scanf("%d",&a[i]);
		in[i]=cautbin(a[i]);
	}
	in[m]++;
	
	
	for(i=1;i<=p;++i)
		scanf("%d",&b[i]);
	
	l=m;
	back1(1);
	
	while(!ok&&l<=p) back(1,++l);
	
	printf("%d\n",nr);
	
	fclose(stdin);
	fclose(stdout);
	return 0;
}