Pagini recente » Cod sursa (job #2289458) | Cod sursa (job #2069186) | Cod sursa (job #2928494) | Cod sursa (job #2580656) | Cod sursa (job #1588638)
#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 >> ws >> a >> ws >> b;
const int n = a.size(), m = b.size();
array<vector<vector<int>>, 2> d;
for(int i = 0; i < 2; ++i){
d[i] = 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.
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){
d[i&1][j][k] = 1;
continue; }
d[i&1][j][k] = 0;
if(i > 0 && j > 0 && a[pi] == a[pj]){
d[i&1][j][k] += d[(i&1)^1][j-1][k]; }
if(i > 0 && l > 0 && a[pi] == b[pl]){
d[i&1][j][k] += d[(i&1)^1][j][k]; }
if(k > 0 && j > 0 && b[pk] == a[pj]){
d[i&1][j][k] += d[i&1][j-1][k-1]; }
if(k > 0 && l > 0 && 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; } } }
for(int j = 0; j <= n; ++j){
for(int k = 0; k <= m; ++k){
d[(i&1)^1][j][k] = 0; } } }
g << rez;
return 0; }