Cod sursa(job #2561318)

Utilizator MocalinnoMoca Andrei Catalin Mocalinno Data 28 februarie 2020 18:45:18
Problema Subsir Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.36 kb
#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
}