Cod sursa(job #1588632)

Utilizator tamionvTamio Vesa Nakajima tamionv Data 3 februarie 2016 13:19:47
Problema Iv Scor 55
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.32 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.

	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; }