Cod sursa(job #611131)

Utilizator GheorgheMihaiMihai Gheorghe GheorgheMihai Data 30 august 2011 21:33:34
Problema Pedefe Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.6 kb
#include <stdio.h>
#include <string.h>

int n, m, p;
int v1[502], v2[502], v3[102];
int d1[502][502], d2[502][502], aib[502][502];

const int mod = 666013;

void update (int poz, int m, int val)
{
	while (poz <= 500)
	{
		aib[poz][m] += val;
		if (aib[poz][m] >= mod)
			aib[poz][m] -= mod;
		poz += poz & -poz;
	}
}

int query (int poz, int m)
{
	int val = 0;
	while (poz)
	{
		val += aib[poz][m];
		if (val >= mod)
			val -= mod;
		poz -= poz & -poz;
	}
	return val;
}

int main ()
{
	freopen ("pedefe.in", "r", stdin);
	freopen ("pedefe.out", "w", stdout);
	
	scanf ("%d %d %d", &n, &m, &p);
	
	int i, j, k, s;
	
	for (i = 1; i <= n; i ++)
		scanf ("%d", &v1[i]);
	for (i = 1; i <= m; i ++)
		scanf ("%d", &v2[i]);
	for (i = 1; i <= p; i ++)
		scanf ("%d", &v3[i]);
	
	v1[0] = v1[0] = 1;
	d1[0][0] = 1;
	for (i = 1; i <= p + 1; i ++)
	{
		memcpy (d2, d1, sizeof (d1));
		memset (d1, 0, sizeof (d1));
		memset (aib, 0, sizeof (aib));
		
		for (j = 0; j <= n; j ++)
		{
			s = 0;
			for (k = 0; k <= m; k ++)
			{
				s += d2[j][k];
				if (s >= mod)
					s -= mod;
				update (v1[j], k, s);
				
				if (j >= n || k >= m)
					continue;
				if (v1[j + 1] == v2[k + 1] && v1[j + 1] == v3[i])
				{
					d1[j + 1][k + 1] += query (v1[j + 1], k);
					if (d1[j + 1][k + 1] >= mod)
						d1[j + 1][k + 1] -= mod;
				}
				else
					if (v1[j + 1] == v2[k + 1])
					{
						d2[j + 1][k + 1] += query (v1[j + 1], k);
						if (d2[j + 1][k + 1] >= mod)
							d2[j + 1][k + 1] -= mod;
					}
			}
		}
	}
	
	printf ("%d\n", query (500, m));
	return 0;
}