Pagini recente » Cod sursa (job #3199300) | Cod sursa (job #2923163) | Cod sursa (job #2565534) | Cod sursa (job #3249092) | Cod sursa (job #1691507)
#include <fstream>
#include <cstring>
using namespace std;
ifstream fin("iv.in");
ofstream fout("iv.out");
const int MAX = 510;
const int MOD = 3210121;
char a[MAX], b[MAX];
int D[2][MAX][MAX];
int st1, st2, dr1, dr2;
int N, M;
bool lc, lp;
int sol;
int main()
{
int i, j;
fin.getline(a + 1, MAX);
fin.getline(b + 1, MAX);
N = strlen(a + 1);
M = strlen(b + 1);
D[0][0][N + 1] = 1; lc = 0, lp = 1;
for ( st1 = 0; st1 <= N; st1++, lc = !lc, lp = !lp )
for ( st2 = 0; st2 <= M; st2++ )
for ( dr1 = N + 1; dr1 > st1; dr1-- )
if ( !( st1 == 0 && st2 == 0 && dr1 == N + 1 ) )
{
dr2 = M + 1 - st1 - st2 + ( N + 1 - dr1 );
if ( !(dr2 >= 1 && dr2 <= M + 1) ) continue;
D[lc][st2][dr1] = 0;
if ( a[st1] == a[dr1] && st1 != 0 && dr1 != N + 1 )
D[lc][st2][dr1] = ( D[lc][st2][dr1] + D[lp][st2][dr1 + 1] ) % MOD;
if ( a[st1] == b[dr2] && st1 != 0 && dr2 != M + 1 )
D[lc][st2][dr1] = ( D[lc][st2][dr1] + D[lp][st2][dr1] ) % MOD;
if ( a[st2] == b[dr1] && st2 != 0 && dr1 != N + 1 )
D[lc][st2][dr1] = ( D[lc][st2][dr1] + D[lc][st2 - 1][dr1 + 1] ) % MOD;
if ( a[st2] == b[dr2] && st2 != 0 && dr2 != M + 1 )
D[lc][st2][dr1] = ( D[lc][st2][dr1] + D[lc][st2 - 1][dr1] ) % MOD;
if ( ( dr2 - st2 == 1 && dr1 - st1 == 1 && ( N + M ) % 2 == 0 ) || ( dr2 - st2 == 2 && dr1 - st1 == 1 && ( N + M ) % 2 ) || ( dr2 - st2 == 1 && dr1 - st1 == 2 && ( N + M ) % 2 ) )
sol = ( sol + D[lc][st2][dr1] ) % MOD;
}
fout << sol;
fin.close();
fout.close();
return 0;
}