Pagini recente » Cod sursa (job #1533031) | Cod sursa (job #2355697) | Clasament preONI 2007, Clasele 11-12 | Cod sursa (job #1244029) | Cod sursa (job #385760)
Cod sursa(job #385760)
#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;
}