Cod sursa(job #787012)

Utilizator darrenRares Buhai darren Data 12 septembrie 2012 15:04:17
Problema Iv Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.32 kb
#include <cstring>
#include <fstream>
#include <algorithm>

using namespace std;

const int MOD = 3210121;

int N, M;
char A1[502], A2[502];
int D[2][502][502];
int result;

int main()
{
	ifstream fin("iv.in");
	ofstream fout("iv.out");
	
	fin >> A1 >> A2;
	N = strlen(A1);
	M = strlen(A2);
	
	int act = 0;
	
	D[act][0][0] = 1;
	for (int i = 0; i <= N; ++i)
	{
		for (int j = 0; j <= M && i + j <= (M + N) / 2; ++j)
			if (i + j != 0)
				for (int k = 0; k <= i + j && k <= N - i; ++k)
				{
					int l = (i + j) - k;
					if (l > M - j) continue;
				
					if (i != 0)
					{
						if (k != 0 && A1[i - 1] == A1[N - k])
							D[act][j][k] += D[!act][j][k - 1];
						if (l != 0 && A1[i - 1] == A2[M - l])
							D[act][j][k] += D[!act][j][k];
						while (D[act][j][k] >= MOD) D[act][j][k] -= MOD;
					}
					if (j != 0)
					{
						if (k != 0 && A2[j - 1] == A1[N - k])
							D[act][j][k] += D[act][j - 1][k - 1];
						if (l != 0 && A2[j - 1] == A2[M - l])
							D[act][j][k] += D[act][j - 1][k];
						while (D[act][j][k] >= MOD) D[act][j][k] -= MOD;
					}
				}
		
		if (i <= (N + M) / 2)
			for (int j = 0; j <= (N + M) / 2; ++j)
			{
				result += D[act][(N + M) / 2 - i][j];
				if (result >= MOD) result -= MOD;
			}
		
		act = !act;
		memset(D[act], 0, sizeof(D[act]));
	}
	
	fout << result << '\n';
	
	fin.close();
	fout.close();
}