Cod sursa(job #2348555)

Utilizator triscacezarTrisca Vicol Cezar triscacezar Data 19 februarie 2019 20:11:10
Problema Pedefe Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.51 kb
#include <bits/stdc++.h>

using namespace std;
const int mod=666013;

ifstream f("pedefe.in");
ofstream g("pedefe.out");

int n,m,p,i,j,k,cr,S1[510],S2[510],S3[110],aib[510],val[510],dyn[2][510][510];

int sum(int a,int b)
{
    return (a+b>=mod)?a+b-mod:a+b;
}

void upd(int poz,int val)
{
    for(;poz<=501;poz+=poz&-poz)
        aib[poz]=sum(aib[poz],val);
}
int get(int poz)
{
    int ret=0;
    for(;poz;poz-=poz&-poz)
        ret=sum(ret,aib[poz]);
    return ret;
}

int main()
{
    f>>n>>m>>p;
    for(i=1;i<=n;i++)f>>S1[i];
    for(i=1;i<=m;i++)f>>S2[i];
    for(i=1;i<=p;i++)f>>S3[i];
    dyn[0][0][0]=1;cr=1;
    for(i=0;i<=p;i++)
    {
        cr=1-cr;
        val[0]=dyn[cr][0][0];
        for(j=1;j<=n;j++)
        {
            memset(aib,0,sizeof(aib));
            for(k=1;k<=m;k++)
            {
                upd(S2[k-1]+1,val[k-1]);
                dyn[1-cr][j][k]=0;
                if(S1[j]==S2[k])
                {
                    if(S1[j]==S3[i+1]&&i<k)
                        dyn[1-cr][j][k]=sum(dyn[1-cr][j][k],get(S1[j]+1));
                    else
                        dyn[cr][j][k]=sum(dyn[cr][j][k],get(S1[j]+1));
                }
                val[k]=sum(val[k],dyn[cr][j-1][k]);
            }
        }
        if(i==1)
            dyn[0][0][0]=0;
        for(j=1;j<=m;j++)
            val[j]=0;
    }
    int ans=0;
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
            ans=sum(ans,dyn[cr][i][j]);
    g<<ans;
    return 0;
}