Cod sursa(job #331311)

Utilizator raduzerRadu Zernoveanu raduzer Data 13 iulie 2009 17:44:22
Problema Subsir Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.42 kb
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

#define ii prec1[i][k]
#define jj prec2[j][k]

const int MOD = 666013;
const int MAX_N = 510;
const int SIGMA = 28;

int n, m;
char a[MAX_N], b[MAX_N];
int d[MAX_N][MAX_N], c[MAX_N][MAX_N];
int prec1[MAX_N][SIGMA], prec2[MAX_N][SIGMA];

int main()
{
	int i, j, k;
	freopen("subsir.in", "r", stdin);
	freopen("subsir.out", "w", stdout);

	scanf("%s\n", a);
	scanf("%s\n", b);

	n = strlen(a);
	m = strlen(b);

	for (i = 0; i < n; ++i)
		a[i] = a[i] - 'a' + 1;

	for (i = 0; i < m; ++i)
		b[i] = b[i] - 'a' + 1;

	for (i = 1; i <= n; ++i)
	{
		for (j = 1; j <= 26; ++j)
			prec1[i][j] = prec1[i - 1][j];

		prec1[i][a[i - 1]] = i - 1;
	}

	for (i = 1; i <= m; ++i)
	{
		for (j = 1; j <= 26; ++j)
			prec2[i][j] = prec2[i - 1][j];

		prec2[i][b[i - 1]] = i - 1;
	}

	for (i = 0; i < n; ++i)
		for (j = 0; j < m; ++j)
			if (a[i] == b[j])
			{
				c[i][j] = c[i - 1][j - 1] + 1;
				if (c[i][j] == 1) 
					d[i][j] = 1;
			}
			else c[i][j] = max(c[i - 1][j], c[i][j - 1]);

	for (i = 0; i < n; ++i)
		for (j = 0; j < m; ++j)
			if (a[i] == b[j])
				for (k = 1; k <= 26; ++k)
					d[i][j] =  (c[i][j] == c[ii][jj] + 1) ? (d[i][j] + d[ii][jj]) % MOD : d[i][j];

	int sol = 0;

	for (i = 0; i < n; ++i)
		for (j = 0; j < m; ++j)
			if ((c[i][j] == c[n - 1][m - 1]) && (prec1[n][a[i]] == i) && (prec2[m][b[j]] == j))
				sol = (sol + d[i][j]) % MOD;

	printf("%d\n", sol);
}