Pagini recente » Cod sursa (job #3182953) | Cod sursa (job #1426261) | Cod sursa (job #2709854) | Cod sursa (job #11650) | Cod sursa (job #3161421)
//oftica si durere in suflet
#include <fstream>
#include <vector>
#include <algorithm>
#define ll long long
using namespace std;
//d[i][j][k] = cate subsiruri comune si distincte
//folosesc prefixul [1, i] din primul sir
//folosesc prefixul [1, j] din al doilea sir
//si se termina pe pozitia a[i] == b[j]
//si au lungimea k
//d[i][j][k] = daca a[i] == b[j],
//
const int MOD = 666013;
const int NMAX = 500;
const int CHR = 256;
int d[NMAX + 1][NMAX + 1][NMAX + 1];
int last[NMAX + 1][2];
int fr[CHR];
signed main()
{
ifstream cin("subsir.in");
ofstream cout("subsir.out");
int i, j, k, l, n, m;
string a, b;
cin >> a >> b;
n = a.size();
m = b.size();
a = "!" + a;//scuze Francu
b = "!" + b;
for (i = 1; i <= n; i++)
{
last[i][0] = fr[a[i]];
fr[a[i]] = i;
}
for (i = 'a'; i <= 'z'; i++)
fr[i] = 0;
for (i = 1; i <= m; i++)
{
last[i][1] = fr[b[i]];
fr[b[i]] = i;
}
int len = 0;
for (i = 1; i <= n; i++)
for (j = 1; j <= m; j++)
if (a[i] == b[j])
{
int l1, l2;
for (l1 = i - 1; l1 >= 1 and a[l1] != a[i]; l1--);
for (l2 = j - 1; l2 >= 1 and b[l2] != b[j]; l2--);
if (l1 == 0 and l2 == 0)
{
d[i][j][1] = 1;
len = 1;
}
}
for (k = 2; k <= n and k <= m; k++)
for (j = 1; j <= m; j++)
for (i = 1; i <= n; i++)
if (a[i] == b[j])
{
for (int l1 = i - 1; l1 >= last[i][0] and l1 >= 1; l1--)
for (int l2 = j - 1; l2 >= last[j][1] and l2 >= 1; l2--)
d[i][j][k] = (d[i][j][k] + d[l1][l2][k - 1]) % MOD;
if (d[i][j][k])
len = k;
}
int ans = 0;
for (i = 1; i <= n; i++)
for (j = 1; j <= m; j++)
if (a[i] == b[j])
ans = (ans + d[i][j][len]) % MOD;
cout << ans;
}