Pagini recente » Cod sursa (job #742368) | Cod sursa (job #18835) | Cod sursa (job #338147) | Cod sursa (job #2579176) | Cod sursa (job #2252502)
#include<fstream>
#define MOD 666013
using namespace std;
ifstream fi("pedefe.in");
ofstream fo("pedefe.out");
int n,m,p,S1[505],S2[505],S3[505],cr,Dp[2][505][505],F[2][505][505],rez,i,j,k;
void adu(int &x, int y)
{
long long rez=x+y;
if(rez>=MOD)
rez-=MOD;
x=rez;
}
void upd(int cr, int pozx, int pozy, int val)
{
int cpy;
if(val==0)
return;
while(pozx<=m+1)
{
cpy=pozy;
while(pozy<=501)
{
adu(F[cr][pozx][pozy],val);
pozy=pozy+(pozy&(pozy^(pozy-1)));
}
pozy=cpy;
pozx=pozx+(pozx&(pozx^(pozx-1)));
}
}
int qry(int cr, int pozx, int pozy)
{
int rez=0;
int cpy;
while(pozx>=1)
{
cpy=pozy;
while(pozy>=1)
{
adu(rez,F[cr][pozx][pozy]);
pozy=pozy-(pozy&(pozy^(pozy-1)));
}
pozy=cpy;
pozx=pozx-(pozx&(pozx^(pozx-1)));
}
return rez;
}
int main()
{
fi>>n>>m>>p;
for(i=1; i<=n; i++)
fi>>S1[i];
for(i=1; i<=m; i++)
fi>>S2[i];
for(i=1; i<=p; i++)
fi>>S3[i];
Dp[0][0][0]=1;
cr=1;
for(i=0; i<=p; i++)
{
cr=1-cr;
for(j=1; j<=n; j++)
{
for(k=1; k<=m; k++)
{
upd(cr,k,S1[j-1]+1,Dp[cr][j-1][k-1]);
upd(1-cr,k,S1[j-1]+1,Dp[1-cr][j-1][k-1]);
if(S1[j]==S2[k])
{
if(S1[j]==S3[i])
Dp[cr][j][k]=qry(1-cr,k,S1[j]+1);
else
Dp[cr][j][k]=qry(cr,k,S1[j]+1);
if(i==p)
adu(rez,Dp[cr][j][k]);
}
else
Dp[cr][j][k]=0;
}
}
if(i==1)
Dp[0][0][0]=0;
for(j=1; j<=m+1; j++)
for(k=1; k<=501; k++)
F[1-cr][j][k]=F[cr][j][k]=0;
}
fo<<rez<<"\n";
fi.close();
fo.close();
return 0;
}