Cod sursa(job #1749898)

Utilizator StarGold2Emanuel Nrx StarGold2 Data 29 august 2016 02:38:40
Problema Pedefe Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.53 kb
/*
 * Brut 2, urmeaza sa il optimizez...
 */
#include <bits/stdc++.h>
using namespace std;

ifstream in ( "pedefe.in"  );
ofstream out( "pedefe.out" );

const int DIM = 5e2 + 5;
const int MOD = 666013;

int dp[2][DIM][DIM], cnt[DIM], n, m, p, ans;
int a[DIM], b[DIM], c[DIM], ps[DIM];

void add( int &x, int y ) {
    x += y;

    if( x >= MOD )
        x -= MOD;

    return;
}

int main( void ) {

    in >> n >> m >> p;
    for( int i = 1; i <= n; i ++ ) in >> a[i];
    for( int j = 1; j <= m; j ++ ) in >> b[j];
    for( int k = 1; k <= p; k ++ ) in >> c[k];

    dp[0][0][0] = ps[0] = 1;
    for( int k = 0, l = 0; k <= p; k ++, l = 1 - l ) {

        for( int i = 1; i <= n; i ++ )
        for( int j = 1; j <= m; j ++ )
            dp[1 - l][i][j] = 0;

        for( int i = 1; i <= n; i ++ ) {
            for( int j = ( (k == 0) ? 1 : 0 ); j < DIM; j ++ )
                ps[j] = 0;

            for( int j = 1; j <= m; j ++ ) {

                if( a[i] == b[j] ) {
                    for( int ii = 0; ii <= a[i]; ii ++ ) {
                        if( k < p && a[i] == c[k + 1] )
                            add( dp[1 - l][i][j], ps[ii] );
                        else
                            add( dp[l - 0][i][j], ps[ii] );
                    }
                }

                if( k == p )
                    add( ans, dp[l][i][j] );

                add( ps[ b[j] ], cnt[j] );
                add( cnt[j], dp[l][i][j] );
            }
        }

        for( int j = 1; j <= m; j ++ )
            cnt[j] = 0;
    }

    out << ans;
    return 0;
}