Cod sursa(job #61384)

Utilizator floringh06Florin Ghesu floringh06 Data 19 mai 2007 11:06:48
Problema Subsir Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.49 kb
using namespace std;

#include <stdio.h>
#include <string.h>
#define max(x,y) ((x>y)?(x):(y))

char c;
int dp[505][505],nexta[505][26],nextb[505][26],sol;
char s1[505],s2[505],out[505];

/*
void construct(int i, int j, int len, char out[505]) {
	int k;
	if (len == dp[0][0]) {
		out[len] = 0;
		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);
		}
	}
}*/

int main() {
	int i,j,n,m;
	freopen("subsir.in","r",stdin);
	freopen("subsir.out","w",stdout);
	i=0;
	scanf("%c",&c);
	do
	 {
	   s1[i]=c; i++;
	   scanf("%c",&c);
	 }
	 while (c>='a' && c<='z');
	n=i; scanf("\n");
	i=0;
	scanf("%c",&c);
	do
	 {
	   s2[i]=c; i++;
	   scanf("%c",&c);
	 }
	while (c>='a' && c<='z');
	m=i;
	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",sol);
	return 0;
}