Problem: 2050E - Three Strings
Language: C++23 (GCC 14-64, msys2)

Previous submission (verdict: Time limit exceeded on test 16):
#include <bits/stdc++.h>

using namespace std;

#define int long long

int dynam(string a,string b,string c,int n,int m,vector<vector<int>> &dp,int d,int e){

    if (dp[n][m]!=-1){return dp[n][m];}

    if (n==0){

        int ans=0;

        for (int i=0;i<m;i++){

            // if (m==3){cout<<b[d-m+i]<<c[d+e-m+i]<<d<<endl;}

            if (b[d-m+i]!=c[d+e-m+i]){ans++;}

        }

        dp[n][m]=ans;

        return ans;

    }

    if (m==0){

        int ans=0;

        for (int i=0;i<n;i++){

            if (a[e-n+i]!=c[d+e-n+i]){ans++;}

        }

        dp[n][m]=ans;

        return ans;

    }

    int alpha,beta=0;

    alpha=dynam(a,b,c,n-1,m,dp,d,e);

    beta=dynam(a,b,c,n,m-1,dp,d,e);

    // cout<<"for n="<<n<<" and m="<<m<<" alpha="<<alpha<<" beta="<<beta<<endl;

    alpha+=(a[e-n]!=c[d+e-n-m]);

    // cout<<a[e-n]<<c[d+e-n-m];

    beta+=(b[d-m]!=c[d+e-m-n]);

    // cout<<b[d-m]<<c[d+e-m-n];

    // cout<<"for n="<<n<<" and m="<<m<<" alpha="<<alpha<<" beta="<<beta<<endl;

    dp[n][m]=min(alpha,beta);

    return dp[n][m];

}

void solve(){

    int t;

    cin>>t;

    while(t--){

        string a,b,c;

        cin>>a>>b>>c;

        vector<vector<int>> dp(a.size()+1,vector<int>(b.size()+1,-1));

        cout<<dynam(a,b,c,a.size(),b.size(),dp,b.size(),a.size())<<endl;

        // for (int i=0;i<=a.size();i++){

        //     for (int j=0;j<=b.size();j++){

        //         cout<<dp[i][j]<<" ";

        //     }

        //     cout<<endl;

        // }

    }

}

#undef int

int main(){

    solve();

    return 0;

}

Submission (verdict: Time limit exceeded on test 16):
#include <bits/stdc++.h>

using namespace std;

#define int long long

int dynam(string a,string b,string c,int n,int m,vector<vector<int>> &dp,int d,int e){

    if (dp[n][m]!=-1){return dp[n][m];}

    if (n==0){

        int ans=0;

        for (int i=0;i<m;i++){

            // if (m==3){cout<<b[d-m+i]<<c[d+e-m+i]<<d<<endl;}

            if (b[d-m+i]!=c[d+e-m+i]){ans++;}

        }

        dp[n][m]=ans;

        return ans;

    }

    if (m==0){

        int ans=0;

        for (int i=0;i<n;i++){

            if (a[e-n+i]!=c[d+e-n+i]){ans++;}

        }

        dp[n][m]=ans;

        return ans;

    }

    int alpha,beta=0;

    alpha=dynam(a,b,c,n-1,m,dp,d,e);

    beta=dynam(a,b,c,n,m-1,dp,d,e);

    // cout<<"for n="<<n<<" and m="<<m<<" alpha="<<alpha<<" beta="<<beta<<endl;

    alpha+=(a[e-n]!=c[d+e-n-m]);

    // cout<<a[e-n]<<c[d+e-n-m];

    beta+=(b[d-m]!=c[d+e-m-n]);

    // cout<<b[d-m]<<c[d+e-m-n];

    // cout<<"for n="<<n<<" and m="<<m<<" alpha="<<alpha<<" beta="<<beta<<endl;

    dp[n][m]=min(alpha,beta);

    return dp[n][m];

}

void solve(){

    int t;

    cin>>t;

    while(t--){

        string a,b,c;

        cin>>a>>b>>c;

        vector<vector<int>> dp(a.size()+1,vector<int>(b.size()+1,-1));

        dp[0][0]=0;

        for (int i=1;i<=a.size();i++){

            dp[i][0]=dp[i-1][0]+(a[a.size()-i]!=c[c.size()-i]);

        }

        for (int i=1;i<=b.size();i++){

            dp[0][i]=dp[0][i-1]+(b[b.size()-i]!=c[c.size()-i]);

        }

        cout<<dynam(a,b,c,a.size(),b.size(),dp,b.size(),a.size())<<endl;

        // for (int i=0;i<=a.size();i++){

        //     for (int j=0;j<=b.size();j++){

        //         cout<<dp[i][j]<<" ";

        //     }

        //     cout<<endl;

        // }

    }

}

#undef int

int main(){

    solve();

    return 0;

}