Bài toán tìm xâu con chung dài nhất năm 2024

Điểm: 400 (p) Thời gian: 2.0s Bộ nhớ: 256M Input: bàn phím Output: màn hình

Cho hai xâu \(s\) và \(t\) chỉ gồm các chữ cái thường \('a'..'z'\). Tìm xâu con chung dài nhất (subsequence) của hai xâu \(s\) và \(t\)

Input

  • Dòng thứ nhất chứa xâu \(s(1\le |s|\le 3000)\)
  • Dòng thứ hai chứa xâu \(t(1\le |t|\le 3000)\)

Output

  • In ra xâu chung dài nhất cần tìm. Nếu có nhiều đáp án in ra bất kì !

Chú ý: Một xâu con của một xâu \(x\) bất kì thu được bằng cách xóa đi một vài kí tự (có thể không xóa kí tự nào) từ xâu \(x\) và nối những phần tử còn lại mà không thay đổi thứ tự của chúng.

Example

Test 1

Input

axyb
abyxb

Output

axb

Note

Giải thích: Ở đây có hai đáp \(axb\) và \(ayb\) đều thỏa mãn nên ta có thể in ra một cái bất kì , trong trường hợp này nó là \(axb\)


QBSTR - Xâu con chung dài nhất

  • Đề bài: https://vnoi.info/problems/QBSTR/
  • Keywords: lcs, string
  • Ngôn ngữ: C++

Công thức tìm xâu con chung dài nhất của 2 xâu A, B:

  • Nếu \(A[i] = B[j]\), \(F[i][j] = F[i-1][j-1] + 1\)
  • Ngược lại, \(F[i][j] = max\{F[i-1][j], F[i][j-1]\}\)

Open in Github • Download


# include 

# include 

# include 

# include 
using namespace std;
int lcs(string &a, string &b) {
    int m = a.size(), n = b.size();
    a = ' ' + a;
    b = ' ' + b;
    vector< vector > f(m+1, vector(n+1, 0));
    for (int i=1; i<=m; i++) for (int j=1; j<=n; j++) {
        if (a[i] == b[j]) f[i][j] = f[i-1][j-1] + 1;
        else f[i][j] = max(f[i-1][j], f[i][j-1]);
    }
    return f[m][n];
}
int main() {
    ios::sync_with_stdio(false); cin.tie(0);
    string a; cin >> a;
    string b; cin >> b;
    cout << lcs(a, b);
}