Pagini recente » Cod sursa (job #2355471) | Cod sursa (job #140142) | Cod sursa (job #1568893) | Cod sursa (job #2901211) | Cod sursa (job #2252612)
#include<fstream>
#include<stdio.h>
#include<string.h>
#define MOD 666013
using namespace std;
FILE *fi=fopen("pedefe.in","r");
ofstream fo("pedefe.out");
int n,m,p,S1[505],S2[505],S3[505],cr,Dp[2][505][505],F[2][505],rez,i,j,k,Val[2][505];
void adu(int &x, int y)
{
int rez=x+y;
if(rez>=MOD)
rez-=MOD;
x=rez;
}
void upd(int cr, int poz, int val)
{
if(val==0)
return;
while(poz<=501)
{
adu(F[cr][poz],val);
poz=poz+(poz&(poz^(poz-1)));
}
}
int qry(int cr, int poz)
{
int rez=0;
while(poz>=1)
{
adu(rez,F[cr][poz]);
poz=poz-(poz&(poz^(poz-1)));
}
return rez;
}
char S[100005];
int l,ind;
void nextS()
{
ind=0;
fread(S,1,100000,fi);
l=strlen(S);
}
int nextInt()
{
int r=0;
if(ind==l)
nextS();
while(S[ind]<'0' || S[ind]>'9')
{
ind++;
if(ind==l)
nextS();
}
while(S[ind]>='0' && S[ind]<='9')
{
r=r*10+S[ind]-'0';
ind++;
if(ind==l)
nextS();
}
return r;
}
int main()
{
n=nextInt();
m=nextInt();
p=nextInt();
for(i=1; i<=n; i++)
S1[i]=nextInt();
for(i=1; i<=m; i++)
S2[i]=nextInt();
for(i=1; i<=p; i++)
S3[i]=nextInt();
Dp[0][0][0]=1;
cr=1;
for(i=0; i<=p; i++)
{
cr=1-cr;
for(j=1; j<=n; j++)
{
Val[cr][0]=Dp[cr][0][0];
Val[1-cr][0]=Dp[1-cr][0][0];
for(k=1; k<=501; k++)
F[0][k]=F[1][k]=0;
for(k=1; k<=m; k++)
{
upd(cr,S2[k-1]+1,Val[cr][k-1]);
upd(1-cr,S2[k-1]+1,Val[1-cr][k-1]);
if(S1[j]==S2[k])
{
if(S1[j]==S3[i])
Dp[cr][j][k]=qry(1-cr,S1[j]+1);
else
Dp[cr][j][k]=qry(cr,S1[j]+1);
if(i==p)
adu(rez,Dp[cr][j][k]);
}
else
Dp[cr][j][k]=0;
adu(Val[cr][k],Dp[cr][j-1][k]);
adu(Val[1-cr][k],Dp[1-cr][j-1][k]);
}
}
if(i==1)
Dp[0][0][0]=0;
for(j=1; j<=m; j++)
Val[1-cr][j]=Val[cr][j]=0;
}
fo<<rez<<"\n";
fclose(fi);
fo.close();
return 0;
}