Cod sursa(job #792269)

Utilizator BarracudaFMI-Alex Dobrin Barracuda Data 26 septembrie 2012 20:25:58
Problema Iv Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.47 kb
#include<fstream>
#include<string.h>
#define dim 510
#define mod 3210121
using namespace std;


ifstream f("iv.in");
ofstream g("iv.out");
int i,j,x1,y1,k,n,m;
int L,ans;
int D[dim][dim],Dx[dim][dim];
char A[dim],B[dim];
int main () {
	
	f>>(A+1);
	f>>(B+1);
	
	n=strlen(A+1);
	m=strlen(B+1);
	L=(n+m)/2;
	Dx[0][0]=1;
	for( k=0 ; k <L ;++k ) {
		
		for(x1=0; x1<=k; ++x1 ) {
			
			for(y1=0; y1<=k && y1+x1<=n ;++y1 ) {
				
				int x2=k-x1;
				int y2=k-y1;
				if( x1+y1< n ) {
					
					if(x1+y1<n-1){
						
						if(A[x1+1]==A[n-y1]){
							D[x1+1][y1+1]+=Dx[x1][y1];
							if(D[x1+1][y1+1]>=mod)
								D[x1+1][y1+1]-=mod;
						}
					}
					if(x2+y2<m){
						
						if(A[x1+1]==B[m-y2]){
							D[x1+1][y1]+=Dx[x1][y1];
							if(D[x1+1][y1]>=mod)
								D[x1+1][y1]-=mod;
						}
					}
				}
				if(x2+y2<m){
					if(x1+y1<n){
						
						if(B[x2+1]==A[n-y1]) {
							D[x1][y1+1]+=Dx[x1][y1];
							if(D[x1][y1+1]>=mod)
								D[x1][y1+1]-=mod;
						}
						
					}
					if(x2+y2<m-1){
						if(	B[x2+1]==B[m-y2]	) {
							D[x1][y1]+=Dx[x1][y1];
							if(D[x1][y1]>=mod)
								D[x1][y1]-=mod;
							
						}
					}
				}
			}
		}
		for(x1=0;x1<=k+1;++x1){
			
			for( y1=0;y1<=k+1 && x1+y1<=n ;++y1){
				Dx[x1][y1]=D[x1][y1];
				D[x1][y1]=0;
			}
		}
	}
	ans=0;
	for(i=0;i<=L;++i)
		for(j=0;j<=L && j+i<=L;++j ){
			ans+=Dx[i][j];
			if(ans>=mod)
				ans-=mod;
		}
	g<<ans<<"\n";
	return 0;
}