Cod sursa(job #1480707)

Utilizator tudi98Cozma Tudor tudi98 Data 3 septembrie 2015 01:44:58
Problema Iv Scor 55
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.49 kb
#include <cstdio>
#include <cstring>
using namespace std;

const int Nmax = 500;
const int Mod = 3210121;

char A[Nmax+2], B[Nmax+2];
int d[2][Nmax+2][Nmax+2];

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

	gets(A+1);
	gets(B+1);

	int n = strlen(A+1);
	int m = strlen(B+1);
           
    int Sol = 0;

    d[0][n+1][0] = 1;
    int p = 0;
    bool nd = n&1;
    bool md = m&1;
	for (int i = 0; i <= n; ++i, p ^= 1)
	{
		for (int j = n+1; j >= i; --j)
			for (int k = 0; k <= m; ++k)
			{
				int h = n + m + 2 - i - j - k;
				
				if(h < 0 || h > m+1) continue;

				if (A[i+1] == A[j-1] && j - 1 >= i + 1) 
					d[p^1][j-1][k] += d[p][j][k];
				if (A[i+1] == B[h-1] && j >= i + 1 && h - 1 >= k) 
					d[p^1][j][k] += d[p][j][k];
				if (B[k+1] == A[j-1] && h >= k + 1 && j - 1 >= i) 
					d[p][j-1][k+1] += d[p][j][k];
				if (B[k+1] == B[h-1] && h - 1 >= k + 1) 
					d[p][j][k+1] += d[p][j][k];

			    if (d[p^1][j-1][k] >= Mod) 
			    	d[p^1][j-1][k] -= Mod;
			 	if (d[p^1][j][k] >= Mod)   
			 		d[p^1][j][k] -= Mod;
			 	if (d[p][j-1][k+1] >= Mod) 
			 		d[p][j-1][k+1] -= Mod;
			 	if (d[p][j][k+1] >= Mod)   
			 		d[p][j][k+1] -= Mod;

			 	if (((j == i + 1 && !nd) || (j == i && nd)) && ((k == h - 1 && !md) || (k == h && md)))
			 		Sol += d[p][j][k];
			 	if (Sol >= Mod) Sol -= Mod;
			 }
		for (int j = n + 1; j >= 0; --j)
			for (int k = 0; k <= n+1; ++k)
				d[p][j][k] = 0;
	}

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