Pagini recente » Cod sursa (job #112061) | Cod sursa (job #331938) | Cod sursa (job #424360)
Cod sursa(job #424360)
//O(N^2*M^2*P)
#include<iostream>
#include<string>
using namespace std;
#define MOD 666013
#define NM 25
int S1[NM],S2[NM],S3[NM];
int sol[NM][NM],bg[NM],bsol[NM],N,M,P,ans;
inline int subs(int Sm[],int SM[])
{
if(Sm[0]>SM[0]) return 0;
memset(sol,0,sizeof(sol));
sol[0][0]=1;
for(int i=1;i<=Sm[0];++i)
for(int j=i;j<=SM[0];++j)
if(Sm[i]==SM[j])
for(int k=i-1;k<j;++k)
sol[j][i]+=sol[k][i-1];
int cans=0;
for(int i=Sm[0];i<=SM[0];++i)
cans+=sol[i][Sm[0]];
return cans;
}
void check()
{
int db=subs(bg,S2);
if(!db) return ;
if(!subs(S3,bg)) return ;
ans+=db;
/*
while(db)
{
for(int i=1;i<=bg[0];++i)
printf("%d ",bg[i]);
printf("\n");
--db;
}
*/
}
void back(int pas)
{
if(pas==N+1)
{
check();
return;
}
//prima data il bag
if(bg[0]==0 || (bg[bg[0]]<=S1[pas]))
{
bsol[pas]=1;
bg[++bg[0]]=S1[pas];
back(pas+1);
--bg[0];
bsol[pas]=0;
}
//acuma nu il bag
back(pas+1);
}
void gen()
{
for(int i=0;i<(1<<N);++i)
{
bg[0]=0;
for(int j=0;j<N;++j)
if(i&(1<<j)) bg[++bg[0]]=S1[j+1];
int cresc=1;
for(int i=2;i<=bg[0];++i)
if(bg[i]<bg[i-1])
{
cresc=0;
break;
}
if(!cresc) continue;
check();
}
}
int main()
{
freopen("pedefe.in","r",stdin);
freopen("pedefe.out","w",stdout);
scanf("%d %d %d",&N,&M,&P);
for(int i=1;i<=N;++i)
scanf("%d",&S1[i]);
for(int i=1;i<=M;++i)
scanf("%d",&S2[i]);
for(int i=1;i<=P;++i)
scanf("%d",&S3[i]);
S1[0]=N;
S2[0]=M;
S3[0]=P;
back(1);
//gen();
printf("%d",ans);
return 0;
}