Cod sursa(job #484325)

Utilizator DraStiKDragos Oprica DraStiK Data 13 septembrie 2010 17:16:28
Problema Pedefe Scor 55
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.71 kb
#include <algorithm>
using namespace std;

#define MOD 666013
#define DIM 505

int s1[DIM],s2[DIM],s3[DIM];
int bst[2][DIM][DIM];
int aib[DIM][DIM];
int n,m,p,sol;

void read ()
{
    int i;

    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]);
}

inline int lsb (int x)
{
    return x&(-x);
}

inline void update (int x,int poz,int val)
{
    for ( ; poz<DIM; poz+=lsb (poz))
        aib[x][poz]=(aib[x][poz]+val)%MOD;
}

inline int query (int x,int poz)
{
    int sum;

    for (sum=0; poz; poz-=lsb (poz))
        sum=(sum+aib[x][poz])%MOD;
    return sum;
}

void solve ()
{
    int i,j,k,sum;

    s1[0]=s2[0]=1;
    bst[0][0][0]=1;
    for (i=0; i<=p; ++i)
    {
        for (j=0; j<=n; ++j)
        {
            sum=0;
            for (k=0; k<=m; ++k)
            {
                sum=(sum+bst[0][j][k])%MOD;
                update (k,s1[j],sum);
                if (j<n && k<m && s1[j+1]==s2[k+1])
                {
                    if (s1[j+1]==s3[i+1])
                        bst[1][j+1][k+1]=(bst[1][j+1][k+1]+query (k,s1[j+1]))%MOD;
                    else
                        bst[0][j+1][k+1]=(bst[0][j+1][k+1]+query (k,s1[j+1]))%MOD;
                }
			}
		}
		if (i==p)
            sol=query (m,DIM);
        memcpy (bst[0],bst[1],sizeof (bst[1]));
        memset (bst[1],0,sizeof (bst[1]));
        memset (aib,0,sizeof (aib));
    }
    printf ("%d",sol);
}

int main ()
{
    freopen ("pedefe.in","r",stdin);
    freopen ("pedefe.out","w",stdout);

    read ();
    solve ();

    return 0;
}