Pagini recente » Cod sursa (job #1146443) | Cod sursa (job #306745) | Cod sursa (job #131374) | Cod sursa (job #1688033) | Cod sursa (job #2561318)
#include <bits/stdc++.h>
#define DAU ios::sync_with_stdio(false); fin.tie(0); fout.tie(0);
#define PLEC fin.close(); fout.close(); return 0;
using namespace std;
ifstream fin("subsir.in");
ofstream fout("subsir.out");
const int mod(666013);
const int N(505);
string a, b;
int n, m, l, res, dp[N][N], coda[N][N], codb[N][N];
bool A[mod + 5], B[mod + 5];
int main()
{
DAU
fin >> a >> b;
n = static_cast<int>(a.size());
a = '*' + a;
for (int i = 1; i <= n; ++i)
{
coda[i][i] = a[i] - 'a';
for (int j = i + 1; j <= n; ++j)
coda[i][j] = (coda[i][j-1] * 27 + a[j] - 'a') % mod;
}
m = static_cast<int>(b.size());
b = '*' + b;
for (int i = 1; i <= m; ++i)
{
codb[i][i] = b[i] - 'a';
for (int j = i + 1; j <= m; ++j)
codb[i][j] = (codb[i][j-1] * 27 + b[j] - 'a') % mod;
}
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= m; ++j)
if (a[i] == b[j])
dp[i][j] = dp[i-1][j-1] + 1;
else dp[i][j] = max(dp[i-1][j], dp[i][j-1]);
l = dp[n][m];
for (int i = 1; i <= n - l + 1; ++i)
A[coda[i][i + l - 1]] = true;
for (int i = 1; i <= m - l + 1; ++i)
B[codb[i][i + l - 1]] = true;
for (int i = mod; i; --i)
if (A[i] && B[i])
++res;
fout << res;
PLEC
}