Pagini recente » Cod sursa (job #2726838) | Cod sursa (job #2887750) | Cod sursa (job #357796) | Cod sursa (job #1075475) | Cod sursa (job #34736)
Cod sursa(job #34736)
# 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;
}