Cod sursa(job #1480984)

Utilizator tudi98Cozma Tudor tudi98 Data 3 septembrie 2015 16:31:06
Problema Iv Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.42 kb
#include <cstdio>
#include <cstring>
using namespace std;

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

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

void Add(int& a,int& b)
{
	a += b;
	if (a >= Mod)
		a -= Mod;
}

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][0][n+1] = 1;
    int p = 0;
    bool nd = n&1;
    bool md = m&1;     
                                                                                                           
    for (int i = 0; i <= n; ++i, p ^= 1)
    {
    	for (int j = 0; j <= m; ++j)
    	{
    		for (int ii = n + 1; ii >= i && ii > 0; --ii)
    		{
    			int jj = n + m + 2 - i - j - ii;
    			
    			if (jj <= 0 || jj > m + 1 || jj < j) 
    				continue;

    			if (i+1 < ii-1 && A[i+1] == A[ii-1]) Add(d[p^1][j][ii-1],d[p][j][ii]);
    			if (j+1 < jj-1 && B[j+1] == B[jj-1]) Add(d[p][j+1][ii],d[p][j][ii]);
    			if (i+1 < ii && jj-1 > j && A[i+1] == B[jj-1]) Add(d[p^1][j][ii],d[p][j][ii]);
    			if (j+1 < jj && ii-1 > i && B[j+1] == A[ii-1]) Add(d[p][j+1][ii-1],d[p][j][ii]);

    			if ((i+1 == ii && j+1 == jj) || ((i+1 == ii-1 && j+1 == jj) || (j+1 == jj-1 && i+1 == ii)))
    				Add(Sol,d[p][j][ii]);
    		}
    	}
    	memset(d[p],0,sizeof d[p]);
    }
  
	printf("%d\n",Sol);
	
}