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

Previous submission (verdict: Wrong answer on test 14):
#define _GLIBCXX_FILESYSTEM
#include <bits/stdc++.h>
using namespace std ;
#define int long long
const int N = 2e5+5 ;
const int M = 1e6+5 ;
const int INF = 1e18  ;
 int mod = 1e9 + 7 ;
const double pi = acos(-1.0) ;

int T = 1 ;







// void bfs(int ver){
//     level[ver] = 0 ;
//     queue < int > q ;
//     q.push(1) ;
//     while(!q.empty()){
//         int fnt = q.front() ;
//         q.pop() ;
//         for(auto it : v[fnt]){

//             if(it == 1){
//                 mn =  min(mn , level[fnt]+1) ;
//                 continue ;
//             }
//             if(level[it] == -1){
//                 //cout << fnt << " " << it << endl ;
//                 level[it] = level[fnt] + 1 ;
//                 q.push(it) ;
//             }
//         }
//     }
// }








// int big_mod(int key, int pow)
// {
//     int ans = 1 ;
//     if(pow == 0) return 1 ;
//     ans = big_mod(key,pow/2) ;
//     ans = 1LL * ans * ans % mod ;
//     if(pow&1) ans = 1LL * ans * key % mod;
//     return ans ;
// }
 



int poww(int n){
    int x = 1 ;
    for(int i = 0 ; i < n ; i++){
        x *= 2 ;
        x %= mod ;
    }
    return x ;
}       


// string dtob(int n){
//     string x ;
//     while(n > 0){
//         if(n%2 == 0) x.push_back('0') ;
//         else x.push_back('1') ;
//         n /= 2 ;
//     }
//     //cout << x << endl ;
//     return x ;
// }


// int dfs(int x){
//         if(level[x] != -1) return level[x] ; 
//        int mx= 0 ;
//        for(auto it : v[x]){
//             mx = max(mx , 1 + dfs(it)) ;
//        }
//        level[x] = mx ;
//        return mx ;
// }


// void dfs(int ver){
//   vis[ver] = 1 ;
//   for(auto it : v[ver]){
//       if(vis[it] == 1) continue ;
//       if(v[it].size() == 3){
//           if(mp[it] > 0) cnt += mp[it] ;
//           dfs(it) ;
//       }
//   }

// }






   
// int spf[N] ;
 
// void sieve(){
//     spf[1] = 1 ;
//     for(int i = 2 ; i < N ; i++){
//         spf[i] = i ;
//         if(i%2 == 0) spf[i] = 2 ;
//     }
//     for(int i = 3 ; i*i < N ; i++){
//         if(spf[i] == i){
//             for(int j = i*i ; j < N ; j +=i){
//                 if(spf[j] == j) spf[j] = i ;
//             }
//         }
//     }
// }


string a , b , c ;
int n , m , l ;
int dp[2002][1002] ;

int fun(int ind1 , int ind2 ){
        if(ind1 == l){
            return 0 ;
        }
        if(dp[ind1][ind2] != -1) return dp[ind1][ind2]  ;

        int from_a = INT_MAX ;
        int from_b = INT_MAX ;

        if(ind2 < n){
            from_a = fun(ind1+1 , ind2+1) ;
            if(c[ind1] != a[ind2]) from_a++ ;

        }

        int ind3 = ind1 - ind2 ;

        if(ind3 < m){
            from_b = fun(ind1+1 , ind2) ;
            if(c[ind1] != b[ind3]) from_b++ ;

        }

        return dp[ind1][ind2] = min(from_a , from_b) ;

        

}






void solve(){
    cin >> a >> b >> c ;
    n = a.size() ;
    m = b.size() ;
    l = c.size() ;

    for(int i = 0; i < 102 ; i++){
        for(int j = 0 ; j < 102 ; j++){
            dp[i][j] = -1 ;
        }
    }

    int ans = fun(0 , 0 ) ;
    cout << ans << endl ;
    


}






int32_t main()
{

    ios_base :: sync_with_stdio(false) ; cin.tie(NULL) ; cout.tie(NULL) ;
    //pre() ;
    int t= 1 ;
    cin >> t ;
    while(t--){
        //cout << "Case "<< T++ << ": " ;
        solve() ;
        //cout << t<< "t" << endl;
    }


}



Submission (verdict: Accepted):
#define _GLIBCXX_FILESYSTEM
#include <bits/stdc++.h>
using namespace std ;
#define int long long
const int N = 2e5+5 ;
const int M = 1e6+5 ;
const int INF = 1e18  ;
 int mod = 1e9 + 7 ;
const double pi = acos(-1.0) ;

int T = 1 ;







// void bfs(int ver){
//     level[ver] = 0 ;
//     queue < int > q ;
//     q.push(1) ;
//     while(!q.empty()){
//         int fnt = q.front() ;
//         q.pop() ;
//         for(auto it : v[fnt]){

//             if(it == 1){
//                 mn =  min(mn , level[fnt]+1) ;
//                 continue ;
//             }
//             if(level[it] == -1){
//                 //cout << fnt << " " << it << endl ;
//                 level[it] = level[fnt] + 1 ;
//                 q.push(it) ;
//             }
//         }
//     }
// }








// int big_mod(int key, int pow)
// {
//     int ans = 1 ;
//     if(pow == 0) return 1 ;
//     ans = big_mod(key,pow/2) ;
//     ans = 1LL * ans * ans % mod ;
//     if(pow&1) ans = 1LL * ans * key % mod;
//     return ans ;
// }
 



int poww(int n){
    int x = 1 ;
    for(int i = 0 ; i < n ; i++){
        x *= 2 ;
        x %= mod ;
    }
    return x ;
}       


// string dtob(int n){
//     string x ;
//     while(n > 0){
//         if(n%2 == 0) x.push_back('0') ;
//         else x.push_back('1') ;
//         n /= 2 ;
//     }
//     //cout << x << endl ;
//     return x ;
// }


// int dfs(int x){
//         if(level[x] != -1) return level[x] ; 
//        int mx= 0 ;
//        for(auto it : v[x]){
//             mx = max(mx , 1 + dfs(it)) ;
//        }
//        level[x] = mx ;
//        return mx ;
// }


// void dfs(int ver){
//   vis[ver] = 1 ;
//   for(auto it : v[ver]){
//       if(vis[it] == 1) continue ;
//       if(v[it].size() == 3){
//           if(mp[it] > 0) cnt += mp[it] ;
//           dfs(it) ;
//       }
//   }

// }






   
// int spf[N] ;
 
// void sieve(){
//     spf[1] = 1 ;
//     for(int i = 2 ; i < N ; i++){
//         spf[i] = i ;
//         if(i%2 == 0) spf[i] = 2 ;
//     }
//     for(int i = 3 ; i*i < N ; i++){
//         if(spf[i] == i){
//             for(int j = i*i ; j < N ; j +=i){
//                 if(spf[j] == j) spf[j] = i ;
//             }
//         }
//     }
// }


string a , b , c ;
int n , m , l ;
int dp[2002][1002] ;

int fun(int ind1 , int ind2 ){
        if(ind1 == l){
            return 0 ;
        }
        if(dp[ind1][ind2] != -1) return dp[ind1][ind2]  ;

        int from_a = INT_MAX ;
        int from_b = INT_MAX ;

        if(ind2 < n){
            from_a = fun(ind1+1 , ind2+1) ;
            if(c[ind1] != a[ind2]) from_a++ ;

        }

        int ind3 = ind1 - ind2 ;

        if(ind3 < m){
            from_b = fun(ind1+1 , ind2) ;
            if(c[ind1] != b[ind3]) from_b++ ;

        }

        return dp[ind1][ind2] = min(from_a , from_b) ;

        

}






void solve(){
    cin >> a >> b >> c ;
    n = a.size() ;
    m = b.size() ;
    l = c.size() ;

    for(int i = 0; i < 2002 ; i++){
        for(int j = 0 ; j < 1002 ; j++){
            dp[i][j] = -1 ;
        }
    }

    int ans = fun(0 , 0 ) ;
    cout << ans << endl ;
    


}






int32_t main()
{

    ios_base :: sync_with_stdio(false) ; cin.tie(NULL) ; cout.tie(NULL) ;
    //pre() ;
    int t= 1 ;
    cin >> t ;
    while(t--){
        //cout << "Case "<< T++ << ": " ;
        solve() ;
        //cout << t<< "t" << endl;
    }


}