Cod sursa(job #2252329)

Utilizator Andrei_CotorAndrei Cotor Andrei_Cotor Data 2 octombrie 2018 18:33:43
Problema Pedefe Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.06 kb
#include<fstream>
#define MOD 666013
using namespace std;
ifstream fi("pedefe.in");
ofstream fo("pedefe.out");
int n,m,p,S1[505],S2[505],S3[505],cr,Dp[2][505][505],F[2][505][505],rez,i,j,k;

void adu(int &x, int y)
{
    long long rez=x+y;
    if(rez>=MOD)
        rez-=MOD;
    x=rez;
}

void upd(int cr, int pozx, int pozy, int val)
{
    int cpy;
    if(val==0)
        return;
    while(pozx<=m+1)
    {
        cpy=pozy;
        while(pozy<=501)
        {
            adu(F[cr][pozx][pozy],val);
            pozy=pozy+(pozy&(pozy^(pozy-1)));
        }
        pozy=cpy;
        pozx=pozx+(pozx&(pozx^(pozx-1)));
    }
}

int qry(int cr, int pozx, int pozy)
{
    int rez=0;
    int cpy;
    while(pozx>=1)
    {
        cpy=pozy;
        while(pozy>=1)
        {
            adu(rez,F[cr][pozx][pozy]);
            pozy=pozy-(pozy&(pozy^(pozy-1)));
        }
        pozy=cpy;
        pozx=pozx-(pozx&(pozx^(pozx-1)));
    }
    return rez;
}

int main()
{
    fi>>n>>m>>p;
    for(i=1; i<=n; i++)
        fi>>S1[i];
    for(i=1; i<=m; i++)
        fi>>S2[i];
    for(i=1; i<=p; i++)
        fi>>S3[i];
    Dp[0][0][0]=1;
    cr=1;
    for(i=0; i<=p; i++)
    {
        cr=1-cr;
        for(j=1; j<=n; j++)
        {
            for(k=1; k<=m; k++)
            {
                upd(cr,k,S1[j-1]+1,Dp[cr][j-1][k-1]);
                upd(1-cr,k,S1[j-1]+1,Dp[1-cr][j-1][k-1]);
                if(S1[j]==S2[k])
                {
                    if(S1[j]==S3[i])
                        Dp[cr][j][k]=qry(1-cr,k+1,S1[j]+1);
                    else
                        Dp[cr][j][k]=qry(cr,k+1,S1[j]+1);
                    if(i==p)
                        adu(rez,Dp[cr][j][k]);
                }
                else
                    Dp[cr][j][k]=0;
            }
        }
        if(i==1)
            Dp[0][0][0]=0;
        for(j=1; j<=m+1; j++)
            for(k=1; k<=501; k++)
                F[1-cr][j][k]=F[cr][j][k]=0;
    }
    fo<<rez<<"\n";
    fi.close();
    fo.close();
    return 0;
}