Cod sursa(job #34736)

Utilizator m_dersidanDersidan Mihai m_dersidan Data 21 martie 2007 12:15:56
Problema Subsir Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.71 kb
# include <stdio.h>
# include <string.h>

# define  _fin	"subsir.in"
# define  _fout "subsir.out"

# define  maxn	505

int dp[maxn][maxn], nexta[maxn][26],nextb[maxn][26], sol, nr[maxn][maxn], toadd[maxn][maxn];

inline int max(int x, int y){ return x>y?x:y; }

int main()
{
	int i,j,k,n,m,a,b;
	char s1[maxn], s2[maxn], out[maxn];
	
	freopen(_fin, "r",stdin);
	freopen(_fout,"w",stdout);
	
	gets(s1);
	gets(s2);
	
	n = strlen(s1);
	m = strlen(s2);

	for (i=0; i<=n; i++) dp[i][m] = 0;
	for (j=0; j<=m; j++) dp[n][j] = 0;
	for (i=n-1; i>=0; --i)
		for (j=m-1; j>=0; --j)
			if (s1[i] == s2[j])
				dp[i][j] = dp[i+1][j+1]+1;
			else
				dp[i][j] = max(dp[i][j+1],dp[i+1][j]);

	for (i=0; i<n; i++) {
		for (j=0; j<26; j++)
			nexta[i][j] = -1;
		for (j=i; j<n; j++)
			if (nexta[i][s1[j]-'a']<0)
				nexta[i][s1[j]-'a'] = j;
	}

	for (i=0; i<m; i++) {
		for (j=0; j<26; j++)
			nextb[i][j] = -1;
		for (j=i; j<m; j++)
			if (nextb[i][s2[j]-'a']<0)
				nextb[i][s2[j]-'a'] = j;
	}

/*	for (i=n-1; i>=0; i--)
		for (j=m-1; j>=0; j--)
			if ( s1[i]==s2[j] ) {
				nr[i][j] = (dp[i][j]==dp[0][0]);
				toadd[i][j]=1;
				for (k='a'; k<='z'; k++) {
					a=nexta[i][k-'a'], b=nextb[j][k-'b'];
					if ( dp[i][j]==dp[a][b]+1 )
						nr[i][j] += nr[a][b],
						toadd[a][b]=0;
				}
			}*/
	nr[0][0]=toadd[0][0]=1;
	for (i=0; i<n; i++)
		for (j=0; j<m; j++)
			if ( s1[i]==s2[j] ) {
				for (k='a'; k<='z'; k++) {
					a=nexta[i][k-'a'], b=nextb[j][k-'a'];
					if ( dp[i][j] == dp[a][b]+1 )
						nr[a][b] += nr[i][j], toadd[a][b]=1, toadd[i][j]=0;
				}
			}

	for (i=0; i<n; i++)
		for (j=0; j<m; j++)
			sol += toadd[i][j]*nr[i][j];

	printf("%d\n", sol);
	
	return 0;
}