Cod sursa(job #385760)

Utilizator alexeiIacob Radu alexei Data 23 ianuarie 2010 14:05:27
Problema Subsir Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.85 kb
#include<stdio.h>
#define NMAX 520
#define sigma 32
#define MOD 666013

char S1[NMAX],S2[NMAX];
int A[NMAX],B[NMAX];

int V1[sigma][NMAX],V2[sigma][NMAX];

//vector< int > P1[sigma],P2[sigma];

int C[NMAX][NMAX],NR[NMAX][NMAX];


inline int max(const int a,const int b)
{
	return a>b?a:b;
}

int main()
{
	freopen("subsir.in","r",stdin);
	freopen("subsir.out","w",stdout);
	
	gets( S1 );
	gets( S2 );
	
	//reading..
	int i,N,M;
	
	int k;
	for( k=0; k<26; ++k )
	 V1[k][0]=V2[k][0]=-1;
	
	for(i=0; S1[i]!='\0' && i<NMAX; ++i)
	{
		A[i]=(int)S1[i]-97;
		//P1[A[i]].push_back(i);

		for( k=0; k<26; ++k )
			if( A[i]==k )
				V1[k][i+1]=i;
			else
				V1[k][i+1]=V1[k][i];
			
		N=i;
	}
	
	for(i=0; S2[i]!='\0' && i<NMAX; ++i)
	{
		B[i]=(int)S2[i]-97;
		//P2[A[i]].push_back(i);
		
		for( k=0; k<26; ++k )
			if( B[i]==k )
				V2[k][i+1]=i;
			else
				V2[k][i+1]=V2[k][i];
		
		
		M=i;
	}
	
	//-new game- || load game || save game || options || credits || exit
	int j;
	for( i=0; i<=N; ++i )
	{
		for(j=0; j<=M; ++j)
		{
			if( A[i]==B[j] )
			{
				C[i][j]=C[i-1][j-1]+1;
			
				if( C[i][j]==1 )
					NR[i][j]=1;
				else
				{
					for( k=0; k<26; ++k )
					{
						int a1=V1[k][i],a2=V2[k][j];
						if( a1!=-1 && a2!=-1 )
						if( (C[ a1 ][ a2 ] == C[ a1-1 ][ a2-1 ]+1) && ( C[a1][a2]==C[i][j]-1 ) && a1<i && a2<j )
						{
							NR[i][j]=(NR[i][j]+NR[a1][a2])%MOD;
						}
					}
				}	
			}
			else
			{
				C[i][j]=max( C[i-1][j], C[i][j-1] );
			}
		}
	}
	
	int ANS=0;
	/*
	for(i=0; i<=N; ++i)
	{	for(j=0; j<=M; ++j)
			printf("%d ",NR[i][j]);
	printf("\n");
	}*/
	
	for( k=0; k<26; ++k )
	{
		int a1=V1[k][N+1],a2=V2[k][M+1];
		if( (C[ a1 ][ a2 ] == C[ a1-1 ][ a2-1 ]+1) && C[a1][a2]==C[N][M] )
				ANS=(ANS+NR[a1][a2])%MOD;
	}
	
	printf("%d\n",ANS);
	
	return 0;
}