Cod sursa(job #846147)

Utilizator valentin.harsanValentin Harsan valentin.harsan Data 1 ianuarie 2013 16:13:58
Problema Pedefe Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.54 kb
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

const int N = 503;
const int P = 103;
const int MOD = 666013;

int n, m, p, s1[N], s2[N], s3[P], d[2][N][N], aib[N][N], s;

inline void update(int aib[], int poz, const int &val) {
	for(; poz <= N; poz += (poz & (-poz))) {
		aib[poz] += val;
		if(aib[poz] >= MOD)
			aib[poz] -= MOD;
	}
}

inline int query(int aib[], int poz) {
	int r = 0;
	for(; poz; poz -= (poz & (-poz))) {
		r += aib[poz];
		if(r >= MOD)
			r -= MOD;
	}
	return r;
}

int main() {
	int i, j, k;
	
	freopen("pedefe.in", "r", stdin);
	freopen("pedefe.out", "w", stdout);
	
	cin >> n >> m >> p;
	
	for(i = 1; i<=n; ++i)
		cin >> s1[i];
	for(i = 1; i<=m; ++i)
		cin >> s2[i];
	for(i = 1; i<=p; ++i)
		cin >> s3[i];
	
	s1[0] = s2[0] = 1;
	d[0][0][0] = 1;
	
	for(k = 0; k <= p; ++k) {
		int pp = k % 2;
		
		memset(aib, 0, sizeof(aib));
		
		for(i = 0; i <= n; ++i)
			for(j = 0; j <= m; ++j) {
				//d[0][i][j] = d[1][i][j];
				d[pp ^ 1][i][j] = 0;
			}
		
		for(i = 0; i<=n; ++i) {
			s = 0;
			
			for(j = 0; j <= m; ++j) {
				
				s += d[pp][i][j];
				if(s >= MOD)
					s -= MOD;
				
				if(s)
					update(aib[j], s1[i], s);
				
				if(i < n && j < m && s1[i + 1] == s2[j + 1]) {
					int poz = pp;
					if(s1[i + 1] == s3[k + 1])
						poz ^= 1;
					
					d[poz][i + 1][j + 1] += query(aib[j], s1[i + 1]);
					if(d[poz][i + 1][j + 1] >= MOD)
						d[poz][i + 1][j + 1] -= MOD;
				}
			}
		}
	}
	
	cout << query(aib[m], N);
	
	return 0;
}