Pagini recente » Cod sursa (job #3291855) | Cod sursa (job #2822713) | Cod sursa (job #1832399) | Cod sursa (job #2143063) | Cod sursa (job #484326)
Cod sursa(job #484326)
#include <algorithm>
using namespace std;
#define MOD 666013
#define DIM 505
int s1[DIM],s2[DIM],s3[DIM];
int bst[2][DIM][DIM];
int aib[DIM][DIM];
int n,m,p,sol;
void read ()
{
int i;
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]);
}
inline int lsb (int x)
{
return x&(-x);
}
inline void update (int x,int poz,int val)
{
for ( ; poz<DIM; poz+=lsb (poz))
{
aib[x][poz]+=val;
if (aib[x][poz]>=MOD)
aib[x][poz]-=MOD;
}
}
inline int query (int x,int poz)
{
int sum;
for (sum=0; poz; poz-=lsb (poz))
{
sum+=aib[x][poz];
if (sum>=MOD)
sum-=MOD;
}
return sum;
}
void solve ()
{
int i,j,k,sum;
s1[0]=s2[0]=1;
bst[0][0][0]=1;
for (i=0; i<=p; ++i)
{
for (j=0; j<=n; ++j)
{
sum=0;
for (k=0; k<=m; ++k)
{
sum+=bst[0][j][k];
if (sum>=MOD)
sum-=MOD;
update (k,s1[j],sum);
if (j<n && k<m && s1[j+1]==s2[k+1])
{
if (s1[j+1]==s3[i+1])
{
bst[1][j+1][k+1]+=query (k,s1[j+1]);
if (bst[1][j+1][k+1]>=MOD)
bst[1][j+1][k+1]-=MOD;
}
else
{
bst[0][j+1][k+1]+=query (k,s1[j+1]);
if (bst[0][j+1][k+1]>=MOD)
bst[0][j+1][k+1]-=MOD;
}
}
}
}
if (i==p)
sol=query (m,DIM);
memcpy (bst[0],bst[1],sizeof (bst[1]));
memset (bst[1],0,sizeof (bst[1]));
memset (aib,0,sizeof (aib));
}
printf ("%d",sol);
}
int main ()
{
freopen ("pedefe.in","r",stdin);
freopen ("pedefe.out","w",stdout);
read ();
solve ();
return 0;
}