Nu aveti permisiuni pentru a descarca fisierul grader_test8.in
Cod sursa(job #16981)
Utilizator | Data | 14 februarie 2007 17:40:38 | |
---|---|---|---|
Problema | Pedefe | Scor | 0 |
Compilator | cpp | Status | done |
Runda | Arhiva de probleme | Marime | 2.34 kb |
#include <stdio.h>
#include <string.h>
#define MAXN 501
#define MAXC 501
#define MAXP 101
#define MOD 666013
int N, M, P;
int a[MAXN], b[MAXN], c[MAXP];
int nr[2][MAXN][MAXN];
int S[2][MAXN][MAXC], Scur[2][MAXC];
//numarul de subsiruri crescatoare comune pentru 2 siruri
//avand un al treilea ca subsir
int main()
{
freopen("pedefe.in", "rt", stdin);
freopen("pedefe.out", "wt", stdout);
scanf("%d %d %d", &N, &M, &P);
a[0] = b[0] = c[0] = 0; //numerele sunt in intervalul [1...500]
for (int i = 1; i <= N; i++)
scanf("%d", a + i);
for (int j = 1; j <= M; j++)
scanf("%d", b + j);
for (int k = 1; k <= P; k++)
scanf("%d", c + k);
//nr[k][i][j] = nr de subsiruri care contin primele k valori din c, si se termina la pozitiile i in sirul a si j in sirul b (a[i] == b[j])
nr[0][0][0] = 1;
int step = 1;
for (int k = 1; k <= P; k++, step ^= 1)
{
nr[step][0][0] = 0;
memset( S, 0, sizeof( S ) );
if (nr[1 ^ step][0][0])
for (int j = 0; j <= M; j++)
S[1 ^ step][j][0] = 1;
for (int i = 1; i <= N; i++) //in S[step][j][ch] se tin numarul total de subsiruri pentru primele i elemente
{ //din sirul a, primele j elemente din sirul b, care au cel mai mare element ch
for (int j = 1; j <= M; j++) //elementele trebuie actualizate pe masura ce creste i-ul
{
nr[step][i][j] = 0;
if (a[i] != b[j])
continue;
for (int ch = 0; ch <= a[i]; ch++)
if (a[i] == c[k])
{
nr[step][i][j] += S[1 ^ step][j - 1][ch];
if (nr[step][i][j] >= MOD)
nr[step][i][j] -= MOD;
}
else
{
nr[step][i][j] += S[step][j - 1][ch];
if (nr[step][i][j] >= MOD)
nr[step][i][j] -= MOD;
}
}
memset( Scur, 0, sizeof(Scur) );
for (int j = 1; j <= M; j++)
{
for (int ch = 0; ch < MAXC; ch++)
{
Scur[step][j] = Scur[step][j - 1];
Scur[1 ^ step][j] = Scur[1 ^ step][j - 1];
}
if (a[i] == b[j])
{
Scur[step][ a[i] ] += nr[step][i][j];
Scur[1 ^ step][ a[i] ] += nr[1 ^ step][i][j];
}
for (int ch = 0; ch < MAXC; ch++)
{
S[step][j][ ch ] += Scur[step][ ch ];
S[1 ^ step][j][ ch ] += Scur[1 ^ step][ ch ];
}
}
}
}
int S = 0;
for (int i = 1; i <= N; i++)
for (int j = 1; j <= M; j++)
if (a[i] == b[j])
{
S += nr[1 ^ step][i][j];
if (S >= MOD)
S -= MOD;
}
printf("%d\n", S);
return 0;
}