Cod sursa(job #17653)

Utilizator astronomyAirinei Adrian astronomy Data 16 februarie 2007 16:03:53
Problema Pedefe Scor 95
Compilator c Status done
Runda Arhiva de probleme Marime 2.75 kb
#include <stdio.h>
#include <string.h>

#define MAXN 512
#define MOD 666013

int N, M, P, S1[MAXN], S2[MAXN], S3[MAXN];
int A[2][MAXN][MAXN], aib[2][MAXN];

void update(int ind, int x, int val)
{
    for(; x < MAXN; x += (x&(x-1))^x)
    {
        aib[ind][x] += val;
        if(aib[ind][x] >= MOD)
            aib[ind][x] -= MOD;
    }
}

int query(int ind, int x)
{
    int val = 0;
    for(; x > 0; x -= (x&(x-1))^x)
    {
        val += aib[ind][x];
        if(val >= MOD)
            val -= MOD;
    }
    return val;
}

int baga(void)
{
    int u = 0, v = 1, i, j, k, j1, k1, r;

    for(j = 1; j <= N; j++)
     for(k = 1; k <= M; k++)
     {
        A[u][j][k] = A[u][j-1][k];
        if(S1[j] == S2[k])
        {
            A[u][j][k] += query(u, S2[k]);
            if(A[u][j][k] >= MOD)
                A[u][j][k] -= MOD;
            A[u][j][k] += 1;
            if(A[u][j][k] >= MOD)
                A[u][j][k] -= MOD;
        }
        update(u, S2[k], A[u][j-1][k]);
     }


    for(i = 1; i <= P; i++)
    {
        memset(A[v], 0, sizeof(A[v]));
        memset(aib[u], 0, sizeof(aib[u]));
        memset(aib[v], 0, sizeof(aib[v]));
        
        for(j = 1; j <= N; j++, memset(aib[u], 0, sizeof(aib[u])),
        memset(aib[v], 0, sizeof(aib[v])) )
         for(k = 1; k <= M; k++)
         {
            A[v][j][k] = A[v][j-1][k];

            if(S1[j] == S2[k])
            {
                if(S1[j] == S3[i])
                {
                    if(i == 1)
                    {
                        A[v][j][k] += 1;
                        if(A[v][j][k] >= MOD)
                            A[v][j][k] -= MOD;
                    }
                    A[v][j][k] += query(u, S1[j]);
                    if(A[v][j][k] >= MOD)
                        A[v][j][k] -= MOD;
                }
                else
                {
                    A[v][j][k] += query(v, S1[j]);
                    if(A[v][j][k] >= MOD)
                        A[v][j][k] -= MOD;
                }
            }

            if(A[u][j-1][k])
                update(u, S2[k], A[u][j-1][k]);
            if(A[v][j-1][k])
                update(v, S2[k], A[v][j-1][k]);
         }
        u ^= 1, v ^= 1;
    }

    for(r = 0, i = 1; i <= M; i++)
        r += A[u][N][i], r %= MOD;

    return r;
}

int main(void)
{
    freopen("pedefe.in", "rt", stdin);
    freopen("pedefe.out", "wt", stdout);

    int i;

    scanf("%d %d %d\n", &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]);

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

    return 0;
}