Pagini recente » Cod sursa (job #2039258) | Cod sursa (job #1248548) | Cod sursa (job #2000800) | Cod sursa (job #2674385) | Cod sursa (job #205571)
Cod sursa(job #205571)
# include <cstdio>
# include <string>
using namespace std;
# define FIN "subsir.in"
# define FOUT "subsir.out"
# define max(a,b) (a>b?a:b)
# define MAXN 505
# define Sigma 26
char A[MAXN];
char B[MAXN];
int i,j,N,M,k;
int C[MAXN][MAXN];
int NextA[MAXN][Sigma];
int NextB[MAXN][Sigma];
int L[MAXN][MAXN];
int main()
{
freopen(FIN,"r",stdin);
freopen(FOUT,"w",stdout);
gets(A+1);
gets(B+1);
N = strlen(A+1);
M = strlen(B+1);
for (i = 1; i <= N; ++i)
for (j = 1; j <= M; ++j)
if (A[i] == B[j])
C[i][j] = C[i-1][j-1]+1;
else
C[i][j] = max(C[i-1][j],C[i][j-1]);
for (i = 1; i <= N; ++i)
for (j = 0; j < Sigma; ++j)
if (A[i] == j+'a')
NextA[i][j] = i;
else
NextA[i][j] = NextA[i-1][j];
for (i = 1; i <= M; ++i)
for (j = 0; j < Sigma; ++j)
if (B[i] == j+'a')
NextB[i][j] = i;
else
NextB[i][j] = NextB[i-1][j];
for (i = 1; i <= N; ++i)
for (j = 1; j <= M; ++j)
if (A[i] == B[j])
{
if (C[i][j] == 1) L[i][j] = 1;
for (k = 0; k < Sigma; ++k)
if (C[NextA[i-1][k]][NextB[j-1][k]]+1==C[i][j])
L[i][j] += L[NextA[i-1][k]][NextB[j-1][k]];
}
int sol = 0;
for (i = 0; i < Sigma; ++i)
if (C[NextA[N][i]][NextB[M][i]] == C[N][M])
sol += L[NextA[N][i]][NextB[M][i]];
printf("%d",sol);
return 0;
}