Cod sursa(job #383101)

Utilizator iulia609fara nume iulia609 Data 15 ianuarie 2010 17:31:40
Problema Iv Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.53 kb
#include<stdio.h>
#include<string>
#define NMAX 505
#define mod 3210121
using namespace std;

int a, b, mij, rez, i, j, t1, t2, c[2][NMAX][NMAX];
char S1[NMAX], S2[NMAX];

int main()
{
	freopen("iv.in", "r", stdin);
	freopen("iv.out", "w", stdout);
	
	gets(S1+1);
	gets(S2+1);
	
	S1[0] = S2[0] = 'z';
	a = strlen(S1)-1;
	b = strlen(S2)-1;
	
	c[0][0][0] = 1;
	mij = (a+b)/2;
	
	t1 = 0;
	for(t2 = 0; t2 < mij; t2++)
	{
		t1 = 1-t1;
		memset(c[t1], 0, sizeof(c[t1]));
		
		for(i = 0; i <= a; i++)
			for(j = 0; j <= a; j++)
			{
				if(c[1 - t1][i][j])
				{
					if(S1[i+1] == S1[a-j] && i+1 < a-j)
					{
						c[t1][i+1][j+1] = (c[t1][i+1][j+1] + c[1-t1][i][j]) % mod;
						//if(c[t1][i+1][j+1] > mod) c[t1][i+1][j+1] -= mod;
					}
					if(S1[i+1] == S2[b-(t2-j)] && i < a-j && t2-i < b - (t2-j))
					{
						c[t1][i+1][j] = (c[t1][i+1][j] + c[1-t1][i][j]) % mod;
						//if(c[t1][i+1][j] > mod) c[t1][i+1][j] -= mod;
					}
					if(S2[i+1] == S2[b-(t2-j)] && t2 - i+1 < b - (t2-j))
					{
						c[t1][i][j] = (c[t1][i][j] + c[1-t1][i][j]) % mod;
						//if(c[t1][i][j] > mod) c[t1][i][j] -= mod;
					}
					if(S2[t2-i+1] == S1[a-j] && i < a-j && t2-i < b -(t2-j))
					{
						c[t1][i][j+1] = (c[t1][i][j+1] + c[1-t1][i][j]) % mod;
						//if(c[t1][i+1][j] > mod) c[t1][i+1][j] -= mod;
					}
				}
			}
	}
	t1 = 1-t1;
	rez = 0;
	for(i = 0; i <= a; i++)
		for(j = 0; j <= a; j++)
		{
			rez = (rez + c[1-t1][i][j])%mod;
			//if(rez > mod) rez -= mod;
		}
	
	printf("%d\n", rez);
	
	return 0;
}