Cod sursa(job #789609)

Utilizator mihaipopa12Popa Mihai mihaipopa12 Data 18 septembrie 2012 19:06:37
Problema Iv Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.71 kb
#include<stdio.h>
#include<cstring>

#define maxdim 505
#define mod 3210121

FILE*f=fopen("iv.in","r");
FILE*g=fopen("iv.out","w");

int n,m;
char A[maxdim],B[maxdim];
int D1[maxdim][maxdim],D2[maxdim][maxdim];

inline void dinamica () {
	
	int each = (n + m)>>1;
	D1[0][0] = 1;
	for ( int chosen = 0 ; chosen < each ; ++chosen ){
		
		for ( int i = 0 ; i <= chosen ; ++i ){
			for ( int j = 0 ; j <= chosen && i + j <= n ; ++j ){
				int sec_front = chosen-i,sec_back = chosen-j;
				
				if ( i + j < n ){
					
					if ( i + j < n - 1 ){
						if ( A[i+1] == A[n-j] ){
							D2[i+1][j+1] += D1[i][j];
							if ( D2[i+1][j+1] >= mod )	D2[i+1][j+1] -= mod;
						}
					}
					
					if ( sec_front + sec_back < m ){
						if ( A[i+1] == B[m-sec_back] ){
							D2[i+1][j] += D1[i][j];
							if ( D2[i+1][j] >= mod )	D2[i+1][j] -= mod;
						}
					}
				}
				
				if ( sec_front + sec_back < m ){
					
					if ( sec_front + sec_back < m - 1 ){
						if ( B[sec_front+1] == B[m-sec_back] ){
							D2[i][j] += D1[i][j];
							if ( D2[i][j] >= mod )	D2[i][j] -= mod;
						}
					}
					
					if ( i + j < n ){
						if ( B[sec_front+1] == A[n-j] ){
							D2[i][j+1] += D1[i][j];
							if ( D2[i][j+1] >= mod )	D2[i][j+1] -= mod;
						}
					}
				}
			}
		}
		
		for ( int i = 0 ; i <= chosen+1 ; ++i ){
			for ( int j = 0 ; j <= chosen+1 && i + j <= n ; ++j ){
				D1[i][j] = D2[i][j];
				D2[i][j] = 0;
			}
		}
	}
	
	int sol = 0;
	for ( int i = 0 ; i <= each ; ++i ){
		for ( int j = 0 ; j <= each && i + j <= n ; ++j ){
			sol += D1[i][j];
			if ( sol >= mod )	sol -= mod;
		}
	}
	
	fprintf(g,"%d\n",sol);
}

int main () {
	
	fscanf(f,"%s%s",A+1,B+1);
	n = strlen(A+1); m = strlen(B+1);
	
	dinamica();
	
	fclose(f);
	fclose(g);
	
	return 0;
}