Cod sursa(job #383604)

Utilizator iulia609fara nume iulia609 Data 17 ianuarie 2010 11:21:34
Problema Iv Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.56 kb
#include <stdio.h>
#include <string>
#define NMAX 505
#define MOD 3210121

int a, b, rez;
int c[2][NMAX][NMAX];
char S1[NMAX], S2[NMAX];

int main()
{ int i, j, t1, t2, mij;
	
	freopen("iv.in", "r", stdin);
	freopen("iv.out", "w", stdout);
	
	//gets(S1+1);
	//gets(S2+1);
	scanf("%s\n", S1 + 1);
	scanf("%s\n", S2 + 1);
	
	S1[0] = S2[0] = ' ';
	
	a = strlen(S1) - 1;
	b = strlen(S2) - 1;
	
	c[0][0][0] = 1;
	
	mij = (a + b)/2;
	
	t1 = 1;
	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] == S2[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 + 1 < a - j + 1 && 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[t2 - 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 + 1 < b - (t2 - j) + 1) 
						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;
				}
	}
	
	for (i = 0; i <= a; ++i)
		for (j = 0; j <= a; ++j)
			rez = (rez + c[1 - t1][i][j]) % MOD;
	
	printf("%d\n", rez);
}