Pagini recente » Cod sursa (job #1023557) | Cod sursa (job #2299218) | Cod sursa (job #1669051) | Cod sursa (job #2690379) | Cod sursa (job #2209864)
#include <bits/stdc++.h>
using namespace std;
char a[505], b[505];
int d[505][505];
int C[505][505];
int L1[505][27], L2[505][27];
int f1[505][505], f2[505][505];
const int MOD = 666013;
int main()
{
freopen("subsir.in", "r", stdin);
freopen("subsir.out", "w", stdout);
scanf("%s", a + 1);
scanf("%s", b + 1);
int La = strlen(a + 1), Lb = strlen(b + 1);
for(int i = 1; i <= La ; ++i)
for(int j = 1; j <= Lb ; ++j)
d[i][j] = max(d[i - 1][j - 1] + (a[i] == b[j]) , max(d[i - 1][j], d[i][j - 1]));
for(int i = 1; i <= La ; ++i){
for(int k = 0; k < 26 ; ++k)
L1[i][k] = L1[i - 1][k];
L1[i][a[i] - 'a'] = i;
}
for(int i = 1; i <= Lb ; ++i){
for(int k = 0; k < 26 ; ++k)
L2[i][k] = L2[i - 1][k];
L2[i][b[i] - 'a'] = i;
}
for(int k = 0; k < 26 ; ++k){
int pos1 = 0, pos2 = 0;
for(int i = 1; i <= La ; ++i)
if(a[i] - 'a' == k) {pos1 = i; break ;}
for(int i = 1; i <= Lb ; ++i)
if(b[i] - 'a' == k) {pos2 = i; break ;}
if(pos1 == 0 || pos2 == 0) continue ;
if(d[pos1][pos2] == 1)
C[pos1][pos2] = 1;
}
int Sol = 0;
for(int i = 1; i <= La ; ++i){
for(int j = 1; j <= Lb ; ++j){
if(a[i] != b[j]) continue ;
for(int k = 0; k < 26 ; ++k){
int l = L1[i - 1][k];
int c = L2[j - 1][k];
if(!(l > 0 && c > 0) || d[l][c] + 1 != d[i][j]) continue ;
C[i][j] += C[l][c];
if(C[i][j] >= MOD) C[i][j] -= MOD;
}
int k = d[i][j];
C[i][j] -= (f1[i][k] + f2[j][k]);
f1[i][k] += C[i][j]; f2[j][k] += C[i][j];
if(d[i][j] == d[La][Lb]) {
Sol += C[i][j];
if(Sol >= MOD) Sol -= C[i][j];
}
}
}
printf("%d", Sol);
return 0;
}