Cod sursa(job #834212)

Utilizator elfusFlorin Chirica elfus Data 13 decembrie 2012 22:26:52
Problema Iv Scor 45
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.26 kb
//Implementare de kkt.

#include <stdio.h>
#include <string.h>
#define MOD 3210121

int dp[2][512][512];
char x[512], y[512];

void baga(int &A, int B)
{
	A += B;
	if (A >= MOD)
		A = A - MOD;
}

int main()
{
	int i, j, k, N, M, sol = 0;
	
	freopen("iv.in", "r", stdin);
	freopen("iv.out", "w", stdout);
	
	gets(x + 1); gets(y + 1);
	N = strlen(x + 1); M = strlen(y + 1);
	
	dp[0][0][0] = 1;
	for (i = 0; i <= N; i ++)
	{
		for (j = 0; i + j <= N; j ++)
			for (k = 0; k <= M; k ++)
			{
				int right = i + k - j;
				if (right < 0 || k + right > M)
					continue;
				if (i + j + k + right == N + M || i + j + k + right == N + M - 1)
				{
					sol += dp[i & 1][j][k];
					continue;
				}
				
				if (x[i + 1] == x[N - j] && i + 1 != N - j)
					baga(dp[(i + 1) & 1][j + 1][k], dp[i & 1][j][k]);
				if (M - right >= 1 && x[i + 1] == y[M - right])
					baga(dp[(i + 1) & 1][j][k], dp[i & 1][j][k]);
				if (y[k + 1] == x[N - j])
					baga(dp[i & 1][j + 1][k + 1], dp[i & 1][j][k]);
				if (M - right >= 1 && y[k + 1] == y[M - right] && k + 1 != M - right)
					baga(dp[i & 1][j][k + 1], dp[i & 1][j][k]);
			}
		for (j = 0; j <= N; j ++)
			for (k = 0; k <= M; k ++)
				dp[i & 1][j][k] = 0;
	}
	
	printf("%d", sol);
	return 0;
}