Cod sursa(job #424205)

Utilizator perticas_catalinperticas catalin perticas_catalin Data 24 martie 2010 17:54:40
Problema Pedefe Scor 15
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.31 kb
//O(N^2*M^2*P)

#include<iostream>
#include<string>

using namespace std;

#define MOD 666013
#define NM 257
#define PM 101

int SOL[NM][NM][PM];

int S1[NM],S2[NM],S3[NM];

int main()
{
    int N,M,P;
    
    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]);
    
    SOL[0][0][0]=1;
    
    for(int i=1;i<=N;++i)
       for(int j=1;j<=M;++j)
           if(S1[i]==S2[j])
              for(int k=0;k<i;++k)
                 if(S1[k]<=S1[i])
                    for(int l=0;l<j;++l)
                       if(S1[k]==S2[l])
                       {
                          SOL[i][j][0]+=SOL[k][l][0];
                          if(SOL[i][j][0]>=MOD) SOL[i][j][0]-=MOD;          
                       }   
                    
    for(int p=1;p<=P;++p) 
    {
       //S3[p] il pun in i,j     
            
       for(int i=p;i<=N;++i)
          if(S3[p]==S1[i])
             for(int j=p;j<=M;++j)
                if(S1[i]==S2[j]) 
                   for(int k=p-1;k<i;++k)
                      if(S1[k]<=S1[i])
                         for(int l=p-1;l<j;++l)
                            if(S1[k]==S2[l])
                            {
                                SOL[i][j][p]+=SOL[k][l][p-1];
                                if(SOL[i][j][p]>=MOD) SOL[i][j][p]-=MOD;            
                            } 
        
       for(int i=p;i<=N;++i)
          for(int j=p;j<=M;++j)
             if(S1[i]==S2[j])
                for(int k=p-1;k<i;++k)
                   if(S1[k]<=S1[i])
                      for(int l=p-1;l<j;++l)
                         if(S1[k]==S2[l])
                         {
                             SOL[i][j][p]+=SOL[k][l][p];
                             if(SOL[i][j][p]>=MOD) SOL[i][j][p]-=MOD;                        
                         }                                          
    }
    
    int ans=0;
    
    for(int i=P;i<=N;++i)
       for(int j=P;j<=M;++j)
       {
          ans+=SOL[i][j][P];
          if(ans>=MOD) ans-=MOD; 
       }
    
    printf("%d",ans);
          
    return 0;
}