Cod sursa(job #1722161)

Utilizator fanache99Constantin-Buliga Stefan fanache99 Data 27 iunie 2016 14:43:24
Problema Pedefe Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.08 kb
#include<cstdio>
#include<cstring>
#define MAXN 510
#define MOD 666013
using namespace std;
int n,m,p;
int s1[MAXN],s2[MAXN],s3[MAXN];
int dp[2][MAXN][MAXN],sum[MAXN],aib[MAXN+3];
void Update(int x,int value){
    for(x;x<MAXN;x=x+((x&(x-1))^x)){
        aib[x]+=value;
        if(aib[x]>=MOD)
            aib[x]-=MOD;
    }
}
int Query(int x){
    int answer=0;
    for(x;x>0;x=x-((x&(x-1))^x)){
        answer+=aib[x];
        if(answer>=MOD)
            answer-=MOD;
    }
    return answer;
}
int main(){
    freopen("pedefe.in","r",stdin);
    freopen("pedefe.out","w",stdout);
    int i,j,k,x=1,y=0,answer=0,add;
    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]);
    dp[0][0][0]=1;
    for(k=0;k<=p;k++){
        memset(sum,0,sizeof(sum));
        for(i=1;i<=n;i++){
            memset(aib,0,sizeof(aib));
            for(j=1;j<=m;j++){
                dp[x][i][j]=0;
                if(s1[i]==s2[j]){
                    add=Query(s1[i]);
                    if(k==0)
                        add++;
                    if(add>=MOD)
                        add-=MOD;
                    if(s1[i]==s3[k+1]&&k<p){
                        dp[x][i][j]+=add;
                        if(dp[x][i][j]>=MOD)
                            dp[x][i][j]-=MOD;
                    }
                    else{
                        dp[y][i][j]+=add;
                        if(dp[y][i][j]>=MOD)
                            dp[y][i][j]-=MOD;
                    }
                }
                else
                    dp[y][i][j]=0;
                Update(s2[j],sum[j]);
                sum[j]+=dp[y][i][j];
                if(sum[j]>=MOD)
                    sum[j]-=MOD;
                if(k==p){
                    answer+=dp[y][i][j];
                    if(answer>=MOD)
                        answer-=MOD;
                }
            }
        }
        x^=1;
        y^=1;
    }
    printf("%d",answer);
    return 0;
}