Problem: 2050E - Three Strings
Language: java

Solution 1 (runtime: 390 ms):
import java.util.*;

public class Q1 {
    public static long solve(long n, HashMap<Long, Long> map) {
        if (n <= 3) {
            return 1;
        }

        if (map.containsKey(n)) {
            return map.get(n);
        }

        long count = solve(n / 4, map) + solve(n / 4, map);
        map.put(n, count);
        return map.get(n);
    }

    public static long gcd(long a, long b) {
        if (a == 0)
            return b;
        if (b == 0)
            return a;

        // Base case
        if (a == b)
            return a;

        // a is greater
        if (a > b) {
            if (a % b == 0)
                return b;
            return gcd(a - b, b);
        }
        if (b % a == 0)
            return a;
        return gcd(a, b - a);
    }

    public static int solve(int ai, int ci, String a, String b, String c, int dp[][]) {
        int bi = ci - ai;
        if (ai == a.length()) {
            String s1 = b.substring(bi);
            String s2 = c.substring(ci);
            if (s1.equals(s2)) {
                return 0;
            }
            int cnt = 0;
            for (int i = 0; i < s1.length(); i++) {
                if (s1.charAt(i) != s2.charAt(i)) {
                    cnt++;
                }
            }

            return cnt;
        }

        if (bi == b.length()) {
            String s1 = a.substring(ai);
            String s2 = c.substring(ci);
            if (s1.equals(s2)) {
                return 0;
            }
            int cnt = 0;
            for (int i = 0; i < s1.length(); i++) {
                if (s1.charAt(i) != s2.charAt(i)) {
                    cnt++;
                }
            }

            return cnt;
        }

        if (dp[ai][ci] != -1) {
            return dp[ai][ci];
        }

        int min = Integer.MAX_VALUE;
        if (a.charAt(ai) == c.charAt(ci)) {
            min = Math.min(solve(ai + 1, ci + 1, a, b, c, dp), min);
        }

        if (b.charAt(bi) == c.charAt(ci)) {
            min = Math.min(solve(ai, ci + 1, a, b, c, dp), min);
        }

        if (a.charAt(ai) != c.charAt(ci) || b.charAt(bi) != c.charAt(ci)) {
            min = Math.min(1 + Math.min(solve(ai + 1, ci + 1, a, b, c, dp), solve(ai, ci + 1, a, b, c, dp)), min);
        }

        return dp[ai][ci] = min;
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int t = sc.nextInt();
        while (t-- > 0) {
            String a = sc.next();
            String b = sc.next();
            String c = sc.next();
            int dp[][] = new int[a.length()][c.length()];
            for (int row[] : dp) {
                Arrays.fill(row, -1);
            }
            System.out.println(solve(0, 0, a, b, c, dp));
        }
    }
}

Solution 2 (runtime: 280 ms):
import java.util.*;

import java.lang.*;

import java.io.*;



public class Codeforces {

    public static void main(String[] args){

        FastReader fr = new FastReader();

        int tc = fr.nextInt();



        while (tc-- > 0) {

            solve(fr);

        }

    }





    private static void solve(FastReader fr) {

        String a = fr.next();

        String b = fr.next();

        String c = fr.next();

        int[][] dp = new int[a.length()+1][b.length()+1];



        for(int[] row : dp) Arrays.fill(row, -1);



        System.out.println(solve(a, b, c, 0, 0, 0, dp));

    }



    static int solve(String a, String b, String c, int i, int j, int k, int[][] dp) {

        if(k == c.length()) return 0;

        if(i > a.length() || j > b.length()) return (int)(1e7);

        boolean isAMatch = false;

        boolean isBMatch = false;



        if(dp[i][j] != -1) return dp[i][j];



        if(i < a.length() && a.charAt(i) == c.charAt(k)){

            isAMatch = true;

        }



        if(j < b.length() && b.charAt(j) == c.charAt(k)){

            isBMatch = true;

        }



        int ans1 = solve(a, b, c, i+1, j, k+1, dp) + (isAMatch ? 0 : 1);

        int ans2 = solve(a, b, c, i, j + 1, k+1, dp) + (isBMatch ? 0 : 1);



        return dp[i][j] = Math.min(ans1, ans2);

    }





    static int[] readIntArray(FastReader fr, int n){

        int[] arr = new int[n];



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

            arr[i] = fr.nextInt();

        }



        return arr;

    }



    static class FastReader {

        BufferedReader br;

        StringTokenizer st;



        public FastReader() {

            br = new BufferedReader(

                    new InputStreamReader(System.in));

        }



        String next() {

            while (st == null || !st.hasMoreElements()) {

                try {

                    st = new StringTokenizer(br.readLine());

                } catch (IOException e) {

                    e.printStackTrace();

                }

            }

            return st.nextToken();

        }



        int nextInt() {

            return Integer.parseInt(next());

        }



        long nextLong() {

            return Long.parseLong(next());

        }



        double nextDouble() {

            return Double.parseDouble(next());

        }



        String nextLine() {

            String str = "";

            try {

                if (st.hasMoreTokens()) {

                    str = st.nextToken("\n");

                } else {

                    str = br.readLine();

                }

            } catch (IOException e) {

                e.printStackTrace();

            }

            return str;

        }

    }



}