Pagini recente » Cod sursa (job #292225) | Cod sursa (job #15814) | Clasament dupa rating | Cod sursa (job #2687598) | Cod sursa (job #203772)
Cod sursa(job #203772)
#include <cstdio>
const int SIG = 26;
const int N = 10;//510;
int n,m, cmax;
char a[N], b[N];
int la[N][SIG], lb[N][SIG];
int c[N][N], nr[N][N];
inline int max ( int a, int b ) { return (a > b) ? a : b; }
int main() {
freopen("subsir.in","rt",stdin);
freopen("subsir.out","wt",stdout);
a[0] = b[0] = ' ';
fgets(a+1,N,stdin);
fgets(b+1,N,stdin);
for (n = 0; a[n] != '\n' && a[n] != '\0'; ++n);
la[1][a[1]-'a'] = 1;
for (int i = 2; i < n; ++i) {
for (int j = 'a'; j <= 'z'; ++j) {
if (a[i] == j)
la[i][j-'a'] = i; else
la[i][j-'a'] = la[i-1][j-'a'];
}
}
for (m = 0; b[m] != '\n' && b[m] != '\0'; ++m);
lb[1][b[1]] = 1;
for (int i = 2; i < n; ++i) {
for (int j = 'a'; j <= 'z'; ++j) {
if (b[i] == j)
lb[i][j-'a'] = i; else
lb[i][j-'a'] = lb[i-1][j-'a'];
}
}
for (int j = 0; j < m; ++j) c[0][j] = 0;
cmax = 0;
for (int i = 1; i < n; ++i) {
c[i][0] = 0;
for (int 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]);
if (c[i][j] > cmax) cmax = c[i][j];
}
}
for (int i = 1; i < n; ++i) {
for (int j = 1; j < m; ++j) {
if (a[i] == b[j]) {
if (c[i][j] == 1) {
nr[i][j] = 1;
} else {
for (int s = 'a'; s <= 'z'; ++s) {
int ii = la[i][s-'a'], jj = lb[j][s-'a'];
if (c[i][j] == c[ii][jj] + 1) {
nr[i][j] += nr[ii][jj];
}
}
}
}
}
}
int r = 0;
for (int s = 'a'; s <= 'z'; ++s)
if (c[la[n-1][s-'a']][lb[n-1][s-'a']] == cmax)
r += nr[la[n-1][s-'a']][lb[n-1][s-'a']];
printf("%d\n",r);
return 0;
}