Это классическая самая длинная общая задача о подпоследовательностях. Рассмотрим i-й символ в строкеx и j-й символ в строке y. И мы используем матрицу 2D dp для записи длины самой длинной общей подпоследовательности с текущими двумя подстроками. Функция:

Обратите внимание, если вы используете строку вместо массива символов, проще использовать cin для ввода вместо использования scanf.

#include <vector>
#include <algorithm>
#include <cstring>
#include <iostream>
using namespace std;
int main(){
 //using scanf to read a string is very tricky
 //so use cin instead
 string a, b;
 while(cin>>a>>b){
  size_t l_a = a.length(), l_b = b.length();
  // initialized to be all 0s
  vector< vector<int> > dp(l_a+1, vector<int> (l_b+1, 0));
  for(int i=1; i<=l_a; i++){
   for(int j=1; j<=l_b; j++){
    if(a[i-1]==b[j-1])
     dp[i][j] = dp[i-1][j-1]+1;
    else
     dp[i][j] = max(dp[i-1][j], dp[i][j-1]);
   }
  }
  cout<<dp[l_a][l_b]<<endl;
 }
}