Cod sursa(job #726449)

Utilizator danalex97Dan H Alexandru danalex97 Data 27 martie 2012 11:17:40
Problema Iv Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
#include <cstdio>
#include <cstring>
#define maxn 510
#define mod 3210121

using namespace std;

int n, m, i, j, k, l, sol, st;
char s1[maxn], s2[maxn];
int d[2][maxn][maxn];

int main() {
	freopen("iv.in", "r", stdin);
	freopen("iv.out", "w", stdout);

	scanf(" %s ", s1 + 1);
	scanf(" %s ", s2 + 1);

	for (n = 1; s1[n] != 0; n++);	n--;
	for (m = 1; s2[m] != 0; m++);	m--;

	d[0][0][0] = 1;
	st = 0;

	for (i = 0; i < (n + m) / 2; i++) {
		for (j = 0; j <= i; j++) {
			for (k = 0; k <= n - j; k++) {
				if (s1[j + 1] == s1[n - k] && j + 1 < n - k) 
					d[1 - st][j + 1][k + 1] = (d[1 - st][j + 1][k + 1] + d[st][j][k]) % mod;
				if (s1[j + 1] == s2[m - (i - k)] && j < n - k && i - j < m - (i - k)) 
					d[1 - st][j + 1][k] = (d[1 - st][j + 1][k] + d[st][j][k]) % mod;		
				if (s2[i - j + 1] == s1[n - k] && j < n - k && i - j < m - (i - k)) 
					d[1 - st][j][k + 1] = (d[1 - st][j][k + 1] + d[st][j][k]) % mod;	
				if (s2[i - j + 1] == s2[m - (i - k)] && i - j + 1< m - (i - k)) 
					d[1 - st][j][k] = (d[1 - st][j][k] + d[st][j][k]) % mod;
				}
			}

		if (i < (n + m / 2) - 1)  
			memset(d[st], 0, sizeof(d[st]));
		st = 1 - st;
	}

	for (i = 0; i <= n; i++)
		for (j = 0; j <= n; j++)
			sol = (sol + d[st][i][j]) % mod;

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

}