Problem: 2050E - Three Strings
Language: c++17 

Solution 1 (runtime: 62 ms):
// Author : Valan Tamil Dasan
#include <bits/stdc++.h>
using namespace std;

#define ll long long
#define pii pair<int, int>
#define pll pair<long long, long long>
#define vi vector<int>
#define vll vector<long long>
#define mii map<int, int>
#define mll map<long long, long long>
#define si set<int>
#define sc set<char>
#define sp <<" "<<


#define f(i,s,e) for(long long int i=s;i<e;i++)
#define cf(i,s,e) for(long long int i=s;i<=e;i++)
#define rf(i,e,s) for(long long int i=e-1;i>=s;i--)
#define pb push_back
#define eb emplace_back


template <class T>
void print_v(vector<T> &v) { cout << "{"; for (auto x : v) cout << x << ","; cout << "\b}"; }
template<class T>void ptp(T a){for(auto x:a)cout<<x.first<<" "<<x.second<<"\n";}
template<class T>void print(T a){cout<<a<<"\n";}

#define MOD 1000000007
#define PI 3.1415926535897932384626433832795
#define read(type) readInt<type>()
ll min(ll a,int b) { if (a<b) return a; return b; }
ll min(int a,ll b) { if (a<b) return a; return b; }
ll max(ll a,int b) { if (a>b) return a; return b; }
ll max(int a,ll b) { if (a>b) return a; return b; }
ll gcd(ll a,ll b) { if (b==0) return a; return gcd(b, a%b); }
ll lcm(ll a,ll b) { return a/gcd(a,b)*b; }
string to_upper(string a) { for (int i=0;i<(int)a.size();++i) if (a[i]>='a' && a[i]<='z') a[i]-='a'-'A'; return a; }
string to_lower(string a) { for (int i=0;i<(int)a.size();++i) if (a[i]>='A' && a[i]<='Z') a[i]+='a'-'A'; return a; }
bool prime(ll a) { if (a==1) return 0; for (int i=2;i<=round(sqrt(a));++i) if (a%i==0) return 0; return 1; }
void yes() { cout<<"YES\n"; }
void no() { cout<<"NO\n"; }
vector<bool> seive(ll num){
    vector<bool> arr(num+1,1);
    for(int i = 2;i<=num;i++){
        if(arr[i] == 1){
            for(int j = i*i;j<=num;j+=i){
                arr[j] = 0;
            }       
        }
    }
    arr[0] = 0;
    arr[1] = 0;  
    return arr;
}

typedef long int int32;
typedef unsigned long int uint32;
typedef long long int int64;
typedef unsigned long long int  uint64;



void solve(){
    string a , b , c; cin>>a>>b>>c;
    ll n = a.size() , m = b.size();
    ll sz = max(n , m) + 2;
    vector<vector<ll>> dp(sz,vll(sz,INT_MAX));
    for(int i = a.size();i>=0;i--){
        for(int j = b.size();j>=0;j--){
            
            int k = i + j;
            if(k >= c.size()) {dp[i][j] = 0;continue;}
            ll l = dp[i+1][j];
            ll r = dp[i][j+1];
            if(a[i] != c[k]){
                l++;
            }if(b[j] != c[k]){
                r++;
            }

            dp[i][j] = min(l , r);
        }
    }
    // for(int i = 0;i<a.size();i++){
    //     // for(auto j : i){
    //     //     cout<<j<<' ';
    //     // }cout<<'\n';
    //     cout<<dp[i][0]<<' ';
    // }
    cout<<dp[0][0]<<'\n';
}

int main(){

  std::ios::sync_with_stdio(false);
  std::cin.tie(nullptr);

  // solve();

  // #ifndef ONLINE_JUDGE
  //   freopen("input.txt", "r", stdin);   // Reading from input.txt
  //   freopen("output.txt", "w", stdout); // Writing to output.txt
  //   freopen("output.txt", "w", stderr); // Writing errors to output.txt
  
  // #endif

    int testCase;
    cin>>testCase;

    // int caseNo = 1;
    while (testCase--) {
      // cout<<"Case #"<<caseNo<<": ";
      solve();
      // caseNo++;
    }

  return 0;

}

Solution 2 (runtime: 62 ms):
#include <bits/stdc++.h>
using namespace std;

#define ll long long
#define pii pair<int, int>
#define pll pair<long long, long long>
#define vi vector<int>
#define vll vector<long long>
#define mii map<int, int>
#define si set<int>
#define sc set<char>
#define PII pair<long long, pair<long long, bool>>
/* FUNCTIONS */
#define f(i, s, e) for (long long int i = s; i < e; i++)
#define cf(i, s, e) for (long long int i = s; i <= e; i++)
#define rf(i, e, s) for (long long int i = e - 1; i >= s; i--)
#define pb push_back
#define eb emplace_back
/* PRINTS */
template <class T>
void print_v(vector<T> &v)
{
    for (auto x : v)
        cout << x << " ";
}
/* UTILS */
#define MOD 1000000007
#define PI 3.1415926535897932384626433832795
#define read(type) readInt<type>()
ll min(ll a, int b) { return (a < b) ? a : b; }
ll min(int a, ll b) { return (a < b) ? a : b; }
ll max(ll a, int b) { return (a > b) ? a : b; }
ll max(int a, ll b) { return (a > b) ? a : b; }
ll gcd(ll a, ll b)
{
    if (b == 0)
        return a;
    return gcd(b, a % b);
}
ll lcm(ll a, ll b) { return a / gcd(a, b) * b; }
string to_upper(string a)
{
    for (int i = 0; i < (int)a.size(); ++i)
        if (a[i] >= 'a' && a[i] <= 'z')
            a[i] -= 'a' - 'A';
    return a;
}
string to_lower(string a)
{
    for (int i = 0; i < (int)a.size(); ++i)
        if (a[i] >= 'A' && a[i] <= 'Z')
            a[i] += 'a' - 'A';
    return a;
}
bool prime(ll a)
{
    if (a == 1)
        return 0;
    for (int i = 2; i <= round(sqrt(a)); ++i)
        if (a % i == 0)
            return 0;
    return 1;
}
void yes() { cout << "YES\n"; }
void no() { cout << "NO\n"; }
ll mod_exp(ll base, ll exp, ll mod)
{
    ll result = 1;
    while (exp > 0)
    {
        if (exp % 2 == 1)
        {
            result = (result * base) % mod;
        }
        base = (base * base) % mod;
        exp /= 2;
    }
    return result;
}
int binarySearch(vector<ll> &arr, int low, int high, long long x)
{
    while (low <= high)
    {
        int mid = low + (high - low) / 2;
        if (arr[mid] == x)
            return mid;
        if (arr[mid] < x)
            low = mid + 1;
        else
            high = mid - 1;
    }
    return -1;
}

int getans (string a , string b,string c,int x,int i ,int j,vector<vector<int>> &dp){
    if(dp[i][j]!=-1){
        return dp[i][j];
    }
    if(x==c.length()){
        return dp[i][j]=0;
    }
    if(i==a.length()){
        int cnt = 0;
        for(int k = j; k < b.length(); k++){
            if(b[k]!=c[a.length()+k]){
                cnt++;
            }
        }
        return dp[i][j]=  cnt;
    }
    if(j == b.length()){
        int cnt = 0;
        for(int k = i; k < a.length(); k++){
            if(a[k]!=c[b.length()+k]){
                cnt++;
            }
        }
        return dp[i][j]=  cnt;
    }
    int c1;
    int c2;
    // cout<<a[i]<<" "<<b[j]<<" "<<c[x]<<endl;
    if(i<a.length()){
        if(a[i]==c[x]){
            c1 = getans(a,b,c,x+1,i+1,j,dp);
        }
        else{
            c1 = 1+ getans(a,b,c,x+1,i+1,j,dp);
        }
    }
    if(j<b.length()){
        if(b[j]==c[x]){
            c2 = getans(a,b,c,x+1,i,j+1,dp);
        }
        else{
            c2 = 1+ getans(a,b,c,x+1,i,j+1,dp);
        }
    }
    if(i<a.length() && j<b.length()){
        return dp[i][j]=  min(c1,c2);
    }
    else if(i<a.length()){
        return dp[i][j]=  c1;
    }
    else{
        return dp[i][j]=  c2;
    }
    // return min(c1,c2);
}

int main()
{
    int t;
    cin >> t;
    while (t--)
    {
        string a ,b,c;
        cin >> a >> b >> c;
        int n = a.length();
        int m = b.length();
        int k = c.length();
        vector<vector<int>>dp(n+1,vector<int>(m+1,-1));
        // cout<<a<<" "<<b<<" "<<c<<endl;
        for (int i = 0; i <= n; ++i) {
            for (int j = 0; j <= m; ++j) {
                if (i == 0 && j == 0) {
                    dp[i][j] = 0;
                } else if (i == 0) {
                    dp[i][j] = dp[i][j-1] + (b[j-1] != c[i+j-1]);
                } else if (j == 0) {
                    dp[i][j] = dp[i-1][j] + (a[i-1] != c[i+j-1]);
                } else {
                    dp[i][j] = min(dp[i-1][j] + (a[i-1] != c[i+j-1]),
                                   dp[i][j-1] + (b[j-1] != c[i+j-1]));
                }
            }
        }
        cout<<dp[n][m]<<endl;
    }
}