Cod sursa(job #92513)

Utilizator stef2nStefan Istrate stef2n Data 15 octombrie 2007 20:15:36
Problema Subsir Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.6 kb
#include <cstdio>
#include <cstring>

#define NMAX 505

int M,N;
char a[NMAX], b[NMAX];
short int L[NMAX][NMAX][26], cnt[NMAX][NMAX][26];
short int maxL[NMAX][NMAX], sumcnt[NMAX][NMAX];

int solve()
{
	int i,j,k;
	// initializari
	for(i=0; i<=M; i++)
		for(k=0; k<26; k++)
		{
			L[i][0][k]=0;
			cnt[i][0][k]=1;
			maxL[i][0]=0;
			sumcnt[i][0]=1;
		}
	for(j=0; j<=N; j++)
		for(k=0; k<26; k++)
		{
			L[0][j][k]=0;
			cnt[0][j][k]=1;
			maxL[0][j]=0;
			sumcnt[0][j]=1;
		}
	// rezolvare
	for(i=1; i<=M; i++)
		for(j=1; j<=N; j++)
		{
			maxL[i][j]=0;
			sumcnt[i][j]=1;
			for(k=0; k<26; k++)
			{
				if(a[i]==k+'a')
					if(b[j]==k+'a')
					{
						L[i][j][k]=maxL[i-1][j-1]+1;
						cnt[i][j][k]=sumcnt[i-1][j-1];
						if(L[i][j][k]==L[i-1][j][k])
							cnt[i][j][k]+=cnt[i-1][j][k];
						if(L[i][j][k]==L[i][j-1][k])
							cnt[i][j][k]+=cnt[i][j-1][k];
					}
					else
					{
						L[i][j][k]=L[i][j-1][k];
						cnt[i][j][k]=cnt[i][j-1][k];
					}
				else
					if(b[j]==k+'a')
					{
						L[i][j][k]=L[i-1][j][k];
						cnt[i][j][k]=cnt[i-1][j][k];
					}
					else
					{
						L[i][j][k]=L[i-1][j-1][k];
						cnt[i][j][k]=cnt[i-1][j-1][k];
					}
				if(maxL[i][j]==L[i][j][k])
				{
					if(maxL[i][j])
						sumcnt[i][j]+=cnt[i][j][k];
				}
				else
					if(maxL[i][j]<L[i][j][k])
					{
						maxL[i][j]=L[i][j][k];
						sumcnt[i][j]=cnt[i][j][k];
					}
			}
		}
	// solutia
	return sumcnt[M][N];
}


int main()
{
	freopen("subsir.in","r",stdin);
	freopen("subsir.out","w",stdout);
	a[0]=b[0]='-';
	fgets(a+1,NMAX,stdin);
	fgets(b+1,NMAX,stdin);
	M=strlen(a)-2;
	N=strlen(b)-2;
	printf("%d\n",solve());
	return 0;
}