Pagini recente » Cod sursa (job #2530298) | Cod sursa (job #3155801) | Cod sursa (job #601009) | Cod sursa (job #500924) | Cod sursa (job #3170559)
#include <bits/stdc++.h>
using namespace std;
const int MOD = 3210121;
const int NMAX = 502;
int n,m;
string a,b;
ifstream fin("iv.in");
ofstream fout("iv.out");
struct Mint {
int val;
Mint(){}
Mint(int x){
val = x;
}
Mint operator + (const Mint &aux) const {
Mint ans;
ans.val = (val+aux.val)%MOD;
return ans;
}
Mint operator += (const Mint &aux) {
val = (val+aux.val)%MOD;
return *this;
}
void afis(){
fout << val << "\n";
}
} dp[2][NMAX][NMAX];;
int main()
{
fin >> a >> b;
n = a.size(), m = b.size();
a = "$"+a;
b = "$"+b;
dp[0][0][0] = 1;
int half = (n+m)/2;
for(int i = 1; i <= (n+m)/2; i++){
int curr = (i&1), prev = !curr;
memset(dp[curr], 0, sizeof(dp[curr]));
for(int p1 = 0; p1 <= n && p1 <= i; p1++){
for(int q1 = 0; p1+q1 <= n && q1 <= i; q1++){
int p2 = i-p1;
int q2 = i-q1;
if(a[p1] == a[n-q1+1]){
dp[curr][p1][q1] += dp[prev][p1-1][q1-1];
}
if(a[p1] == b[m-q2+1]){
dp[curr][p1][q1] += dp[prev][p1-1][q1];
}
if(b[p2] == a[n-q1+1]){
dp[curr][p1][q1] += dp[prev][p1][q1-1];
}
if(b[p2] == b[m-q2+1]){
dp[curr][p1][q1] += dp[prev][p1][q1];
}
}
}
}
Mint ans = 0;
if((n+m)%2 == 0){
for(int i = 0; i <= n; i++){
ans += dp[half&1][i][n-i];
}
}else{
for(int i = 0; i <= n; i++){
ans += dp[half&1][i][n-i-1] + dp[half&1][i][n-i];
}
}
ans.afis();
return 0;
}