Pagini recente » Cod sursa (job #1638426) | Cod sursa (job #2267837) | Cod sursa (job #3250829) | Cod sursa (job #2682111) | Cod sursa (job #1722163)
#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;
}