Pagini recente » Cod sursa (job #2329203) | Cod sursa (job #2921198) | Cod sursa (job #2680799) | Cod sursa (job #1970321) | Cod sursa (job #1821125)
#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;
}