Cod sursa(job #1588636)

Utilizator tamionvTamio Vesa Nakajima tamionv Data 3 februarie 2016 13:37:34
Problema Iv Scor 55
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.6 kb
#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();
 
    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; } } } }
 
    g << rez;
    return 0; }