Pagini recente » Cod sursa (job #783815) | Cod sursa (job #1913948) | Cod sursa (job #357737) | Cod sursa (job #2520318) | Cod sursa (job #484325)
Cod sursa(job #484325)
#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]=(aib[x][poz]+val)%MOD;
}
inline int query (int x,int poz)
{
int sum;
for (sum=0; poz; poz-=lsb (poz))
sum=(sum+aib[x][poz])%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=(sum+bst[0][j][k])%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]=(bst[1][j+1][k+1]+query (k,s1[j+1]))%MOD;
else
bst[0][j+1][k+1]=(bst[0][j+1][k+1]+query (k,s1[j+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;
}