Cod sursa(job #34739)

Utilizator m_dersidanDersidan Mihai m_dersidan Data 21 martie 2007 12:17:56
Problema Subsir Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.34 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;

void construct(int i, int j, int len, char out[81])
{
	int k;
	if (len == dp[0][0]) {
//		out[len] = 0;
//		printf("%s\n",out);
		++sol;
		return;
	}
	for (k=0; k<26; k++) {
		int a=nexta[i][k],b=nextb[j][k];
		if (a>=0 && b>=0 && (!len && dp[a-1][b-1] == dp[0][0] || dp[a-1][b-1] == dp[i-1][j-1]-1)) {
//			out[len] = k+'a';
			construct(a,b,len+1,out);
		}
	}
}
inline int max(int a, int b) { return a>0?a:b; }
int main()
{
	int i,j,n,m;
	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+1;
	}

	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+1;
	}

	construct(0,0,0,out);

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