Cod sursa(job #1821125)

Utilizator LucianTLucian Trepteanu LucianT Data 2 decembrie 2016 17:58:10
Problema Pedefe Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.02 kb
#include <bits/stdc++.h>
#define maxN 505
#define MOD 666013
#define lsb(x) ((x)&(-x))
using namespace std;
int aib[maxN];
int s1[maxN],s2[maxN],s3[maxN];
int dp[2][maxN][maxN],sp[maxN];
int n,m,k,i,j,p,line,old,sol,q,toAdd;
void update(int pos,int val)
{
    for(;pos<maxN;pos+=lsb(pos)){
        aib[pos]+=val;
        if(aib[pos]>=MOD)
            aib[pos]-=MOD;
    }
}
int query(int pos)
{
    int res=0;
    for(;pos>0;pos-=lsb(pos))
    {
        res=res+aib[pos];
        if(res>=MOD)
            res-=MOD;
    }
    return res;
}
int main()
{
    freopen("pedefe.in","r",stdin);
    freopen("pedefe.out","w",stdout);
    scanf("%d %d %d",&n,&m,&k);
    for(i=1;i<=n;i++)
        scanf("%d",&s1[i]);
    for(i=1;i<=m;i++)
        scanf("%d",&s2[i]);
    for(i=1;i<=k;i++)
        scanf("%d",&s3[i]);
    dp[0][0][0]=1;
    for(p=0,line=1;p<=k;p++,line=old)
    {
        old=1-line;
        memset(sp,0,sizeof(sp));
        for(i=1;i<=n;i++)
        {
            memset(aib,0,sizeof(aib));
            for(j=1;j<=m;j++)
            {
                dp[line][i][j]=0;
                if(s1[i]==s2[j])
                {
                    toAdd=query(s1[i]);
                    if(!p) toAdd=(toAdd+1)%MOD;
                    if(p<k && s1[i]==s3[p+1])
                    {
                        dp[line][i][j]=dp[line][i][j]+toAdd;
                        if(dp[line][i][j]>=MOD)
                            dp[line][i][j]-=MOD;
                    }
                    else
                    {
                        dp[old][i][j]=dp[old][i][j]+toAdd;
                        if(dp[old][i][j]>=MOD)
                            dp[old][i][j]-=MOD;
                    }
                }
                else dp[old][i][j]=0;
                update(s2[j],sp[j]);
                sp[j]=(sp[j]+dp[old][i][j])%MOD;
            }
        }
    }
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
            sol=(sol+dp[line][i][j])%MOD;
    printf("%d",sol);
    return 0;
}