Cod sursa(job #166251)

Utilizator filipbFilip Cristian Buruiana filipb Data 27 martie 2008 18:58:35
Problema Pedefe Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.45 kb
#include <stdio.h>

#define MOD 666013
#define aduna(x, y) (((x += y) >= MOD) ? (x -= MOD) : (0))

int N, M, P, S1[512], S2[512], S3[128];

int D[2][505][505], cnt;

int main(void)
{
    int i, j, k, p1, p2, crt = 1, prev = 0, w;
    
    freopen("pedefe.in", "r", stdin);
    freopen("pedefe.out", "w", stdout);

    scanf("%d %d %d", &N, &M, &P);
    for (i = 1; i <= N; ++i)
        scanf("%d", &S1[i]);
    for (i = 1; i <= M; ++i)
        scanf("%d", &S2[i]);
    for (i = 1; i <= P; ++i)
        scanf("%d", &S3[i]);

    D[0][0][0] = 1;
    for (k = 1; k <= P; ++k)
    {
        D[crt][0][0] = 0;
        for (i = 1; i <= N; ++i)
            for (j = 1; j <= M; ++j)
            {
                if (S1[i] != S2[j])
                    continue;
                    
                if (S1[i] == S3[k])
                    w = prev;
                else
                    w = crt;

                D[crt][i][j] = 0;
                for (p1 = 1; p1 < i; ++p1)
                    for (p2 = 1; p2 < j; ++p2)
                        if (S1[p1] == S2[p2] && S1[p1] <= S1[i])
                            aduna(D[crt][i][j], D[w][p1][p2]);
                if (D[w][0][0])
                    aduna(D[crt][i][j], D[w][0][0]);
            }
        crt ^= 1; prev ^= 1;
    }
    
    for (i = 1; i <= N; ++i)
        for (j = 1; j <= M; ++j)
            aduna(cnt, D[prev][i][j]);

    printf("%d\n", cnt);

    return 0;
}