Cod sursa(job #424360)

Utilizator perticas_catalinperticas catalin perticas_catalin Data 24 martie 2010 19:49:52
Problema Pedefe Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.23 kb
//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;
}