Pagini recente » Cod sursa (job #2484014) | Cod sursa (job #2760762) | Cod sursa (job #2796178) | Cod sursa (job #1883342) | Cod sursa (job #1588634)
#include <fstream>
#include <iostream>
#include <string>
#include <vector>
#include <array>
using namespace std;
constexpr int mod = 3210121;
int main(){
ifstream f("iv.in");
ofstream g("iv.out");
string a, b;
f >> a >> b;
const int n = a.size(), m = b.size();
vector<vector<vector<int>>> d(n+1, vector<vector<int>>(n+1, vector<int>(m+1, 0)));
// d[i][j][k] = nr feluri de a face un palindrom folosind primele
// i caractere din a, ultimele j caractere din a, si primele
// k din b. Evident, vor fi l = i+k - j caractere din sfarsitul lui
// b.
d[0][0][0] = 1;
int rez = 0;
for(int i = 0, pi = -1; i <= n; ++i, ++pi){
for(int j = 0, pj = n; i+j <= n; ++j, --pj){
for(int k = 0, l = i-j, pk=-1, pl = m-l; k+l <= m; ++k, ++l, ++pk, --pl){
if(i == 0 && j == 0 && k == 0){
continue; }
d[i&1][j][k] = 0;
if(pi >= 0 && pj < n && a[pi] == a[pj]){
d[i&1][j][k] += d[(i&1)^1][j-1][k]; }
if(pi >= 0 && pl < m && a[pi] == b[pl]){
d[i&1][j][k] += d[(i&1)^1][j][k]; }
if(pk >= 0 && pj < n && b[pk] == a[pj]){
d[i&1][j][k] += d[i&1][j-1][k-1]; }
if(pk >= 0 && pl < m && b[pk] == b[pl]){
d[i&1][j][k] += d[i&1][j][k-1]; }
d[i&1][j][k] %= mod;
if(i+j+k+l == n+m){
rez += d[i&1][j][k];
rez %= mod; } } } }
g << rez;
return 0; }