Cod sursa(job #592094)

Utilizator GavrilaVladGavrila Vlad GavrilaVlad Data 26 mai 2011 18:53:25
Problema Pedefe Scor 85
Compilator cpp Status done
Runda Lista lui wefgef Marime 1.79 kb
#include <cstdio>
#include <cstring>

using namespace std;

#define maxn 510
#define mod 666013

int n, m, p, i, j, k, x, sum;
int a[maxn], b[maxn], c[maxn], d[2][maxn][maxn], aib[maxn][maxn];

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

void update(int aib[], int poz, int val)
{
    while(poz<maxn)
    {
        aib[poz]+=val;
        if(aib[poz]>=mod)
            aib[poz]-=mod;
        poz+=lsb(poz);
    }
}

int query(int aib[], int poz)
{
    int sol=0;
    while(poz)
    {
        sol+=aib[poz];
        if(sol>=mod)
            sol-=mod;
        poz-=lsb(poz);
    }
    return sol;
}

int main()
{
    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", &a[i]);
    for(int j=1; j<=m; ++j)
        scanf("%d", &b[j]);
    for(int k=1; k<=p; ++k)
        scanf("%d", &c[k]);

    d[1][0][0]=1;
    a[0]=b[0]=1;

    for(int k=0; k<=p; ++k)
    {
        memset(aib, 0, sizeof(aib));
        for(int i=0; i<=n; ++i)
            for(int j=0; j<=m; ++j)
            {
                d[0][i][j]=d[1][i][j];
                d[1][i][j]=0;
            }

        for(int i=0; i<=n; ++i)
        {
            sum=0;
            for(int j=0; j<=m; ++j)
            {
                sum+=d[0][i][j];
                if(sum>=mod)
                    sum-=mod;
                update(aib[j], a[i], sum);
                if(i<n && j<m && a[i+1]==b[j+1])
                {
                    x=0;
                    if(a[i+1]==c[k+1])
                        x=1;
                    d[x][i+1][j+1]+=query(aib[j], a[i+1]);
                    if(d[x][i+1][j+1]>=mod)
                        d[x][i+1][j+1]-=mod;
                }
            }
        }
    }

    printf("%d\n", query(aib[m], maxn-1));

    return 0;
}