Problem: 2050E - Three Strings
Language: C++17 (GCC 7-32)

Previous submission (verdict: Time limit exceeded on test 16):
#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();
        vector<vector<int>>dp(n+1,vector<int>(m+1,-1));
        // cout<<a<<" "<<b<<" "<<c<<endl;
        cout<<getans(a,b,c,0,0,0,dp)<<endl;
    }
}

Submission (verdict: Accepted):
#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;
    }
}