ShaysXIA/CodeInsightBench huggingface dataset:
Problem: 2050E - Three Strings
Language: python

Solution 1 (runtime: 1374 ms):
FILE = False


class Solution:
    def __init__(self) -> None:
        pass

    def solve(self, a: str, b: str, c: str) -> int:
        dp = [[0 for _ in range(len(b) + 1)] for _ in range(len(a) + 1)]

        top_row = dp[0]
        for i_b in range(1, len(b) + 1):
            i_c = i_b
            top_row[i_b] = top_row[i_b - 1] + (1 if c[i_c - 1] != b[i_b - 1] else 0)

        for i_a in range(1, len(a) + 1):
            i_c = i_a
            dp[i_a][0] = dp[i_a - 1][0] + (1 if c[i_c - 1] != a[i_a - 1] else 0)

        for i_a in range(1, len(a) + 1):
            for i_b in range(1, len(b) + 1):
                i_c = i_a + i_b
                dp[i_a][i_b] = min(
                    dp[i_a - 1][i_b] + (1 if c[i_c - 1] != a[i_a - 1] else 0),
                    dp[i_a][i_b - 1] + (1 if c[i_c - 1] != b[i_b - 1] else 0),
                )

        return dp[-1][-1]


if __name__ == "__main__":
    if FILE:
        FILE_NAME = "CF_991_div3/inputs/e.txt"
        lines = iter(open(FILE_NAME, "r").read().splitlines())
        get_input = lambda: next(lines)
    else:
        get_input = input

    n_test_cases = int(get_input())
    for _ in range(n_test_cases):
        solution = Solution()
        a, b, c = get_input(), get_input(), get_input()
        print(solution.solve(a, b, c))


Solution 2 (runtime: 2484 ms):
import sys
input = lambda: sys.stdin.buffer.readline().decode().strip()
sys.setrecursionlimit(100000)


for _ in range(int(input())):
    a = input(); n = len(a)
    b = input(); m = len(b)
    c = input()
    dp = [[float('inf')]*(m + 1) for _ in range(n + 1)]

    def solve(i, j):
        if i + j == n + m: return 0
        if dp[i][j] == float('inf'):
            ans1 = (solve(i + 1, j) + (a[i] != c[i + j])) if i < n else float('inf')
            ans2 = (solve(i, j + 1) + (b[j] != c[i + j])) if j < m else float('inf')
            dp[i][j] = min(ans1, ans2)
        return dp[i][j]

    print(solve(0, 0))
Problem: 2050E - Three Strings
Language: python

Solution 1 (runtime: 1374 ms):
FILE = False


class Solution:
    def __init__(self) -> None:
        pass

    def solve(self, a: str, b: str, c: str) -> int:
        dp = [[0 for _ in range(len(b) + 1)] for _ in range(len(a) + 1)]

        top_row = dp[0]
        for i_b in range(1, len(b) + 1):
            i_c = i_b
            top_row[i_b] = top_row[i_b - 1] + (1 if c[i_c - 1] != b[i_b - 1] else 0)

        for i_a in range(1, len(a) + 1):
            i_c = i_a
            dp[i_a][0] = dp[i_a - 1][0] + (1 if c[i_c - 1] != a[i_a - 1] else 0)

        for i_a in range(1, len(a) + 1):
            for i_b in range(1, len(b) + 1):
                i_c = i_a + i_b
                dp[i_a][i_b] = min(
                    dp[i_a - 1][i_b] + (1 if c[i_c - 1] != a[i_a - 1] else 0),
                    dp[i_a][i_b - 1] + (1 if c[i_c - 1] != b[i_b - 1] else 0),
                )

        return dp[-1][-1]


if __name__ == "__main__":
    if FILE:
        FILE_NAME = "CF_991_div3/inputs/e.txt"
        lines = iter(open(FILE_NAME, "r").read().splitlines())
        get_input = lambda: next(lines)
    else:
        get_input = input

    n_test_cases = int(get_input())
    for _ in range(n_test_cases):
        solution = Solution()
        a, b, c = get_input(), get_input(), get_input()
        print(solution.solve(a, b, c))


Solution 2 (runtime: 2264 ms):
import sys
sys.setrecursionlimit(10**6)
testcases = int(input())
for testcase in range(testcases):
    a = str(input())
    b = str(input())
    c = str(input())
    dp = [[-1 for j in range(len(b) + 1)] for i in range(len(a) + 1)]
    def solve(ptr1, ptr2, a, b, c, dp)-> int:
        if ptr1 == len(a) and ptr2 == len(b):
            return 0
        if dp[ptr1][ptr2] != -1:
            return dp[ptr1][ptr2]
        minChange = 2001
        usingA, usingB = 2001, 2001
        if ptr1 < len(a):
            usingA = solve(ptr1 + 1, ptr2, a, b, c, dp)
            if a[ptr1] != c[ptr1 + ptr2]:
                usingA += 1
        if ptr2 < len(b):
            usingB = solve(ptr1, ptr2 + 1, a, b, c, dp)
            if b[ptr2] != c[ptr1 + ptr2]:
                usingB += 1 
        dp[ptr1][ptr2] = min(usingA, usingB)
        return dp[ptr1][ptr2]
    minChange = solve(0, 0, a, b, c, dp)
    print(minChange)
Problem: 2050E - Three Strings
Language: python

Solution 1 (runtime: 1374 ms):
FILE = False


class Solution:
    def __init__(self) -> None:
        pass

    def solve(self, a: str, b: str, c: str) -> int:
        dp = [[0 for _ in range(len(b) + 1)] for _ in range(len(a) + 1)]

        top_row = dp[0]
        for i_b in range(1, len(b) + 1):
            i_c = i_b
            top_row[i_b] = top_row[i_b - 1] + (1 if c[i_c - 1] != b[i_b - 1] else 0)

        for i_a in range(1, len(a) + 1):
            i_c = i_a
            dp[i_a][0] = dp[i_a - 1][0] + (1 if c[i_c - 1] != a[i_a - 1] else 0)

        for i_a in range(1, len(a) + 1):
            for i_b in range(1, len(b) + 1):
                i_c = i_a + i_b
                dp[i_a][i_b] = min(
                    dp[i_a - 1][i_b] + (1 if c[i_c - 1] != a[i_a - 1] else 0),
                    dp[i_a][i_b - 1] + (1 if c[i_c - 1] != b[i_b - 1] else 0),
                )

        return dp[-1][-1]


if __name__ == "__main__":
    if FILE:
        FILE_NAME = "CF_991_div3/inputs/e.txt"
        lines = iter(open(FILE_NAME, "r").read().splitlines())
        get_input = lambda: next(lines)
    else:
        get_input = input

    n_test_cases = int(get_input())
    for _ in range(n_test_cases):
        solution = Solution()
        a, b, c = get_input(), get_input(), get_input()
        print(solution.solve(a, b, c))


Solution 2 (runtime: 187 ms):
t=int(input())
for _ in range(t):
    a=input()
    b=input()
    c=input()
    dp=[[10**9 for j in range(len(b)+1)]for i in range(len(a)+1)]
    dp[0][0]=0
    i=0
    j=0
    for i in range(len(a)+1):
        for j in range(len(b)+1):
            
            if i==0 and j==0 :
                continue
            cost1=0
            cost2=0
            if i != 0 and a[i-1]!=c[i+j-1]:
                cost1=1
            if j!=0 and b[j-1]!=c[i+j-1]:
                cost2=1
            if i==0:
                dp[i][j]=dp[i][j-1]+cost2
            if j==0:
                dp[i][j]=dp[i-1][j]+cost1
            else:
                dp[i][j]=min(dp[i-1][j]+cost1,dp[i][j-1]+cost2)

    print(dp[len(a)][len(b)])
Problem: 2050E - Three Strings
Language: python

Solution 1 (runtime: 1374 ms):
FILE = False


class Solution:
    def __init__(self) -> None:
        pass

    def solve(self, a: str, b: str, c: str) -> int:
        dp = [[0 for _ in range(len(b) + 1)] for _ in range(len(a) + 1)]

        top_row = dp[0]
        for i_b in range(1, len(b) + 1):
            i_c = i_b
            top_row[i_b] = top_row[i_b - 1] + (1 if c[i_c - 1] != b[i_b - 1] else 0)

        for i_a in range(1, len(a) + 1):
            i_c = i_a
            dp[i_a][0] = dp[i_a - 1][0] + (1 if c[i_c - 1] != a[i_a - 1] else 0)

        for i_a in range(1, len(a) + 1):
            for i_b in range(1, len(b) + 1):
                i_c = i_a + i_b
                dp[i_a][i_b] = min(
                    dp[i_a - 1][i_b] + (1 if c[i_c - 1] != a[i_a - 1] else 0),
                    dp[i_a][i_b - 1] + (1 if c[i_c - 1] != b[i_b - 1] else 0),
                )

        return dp[-1][-1]


if __name__ == "__main__":
    if FILE:
        FILE_NAME = "CF_991_div3/inputs/e.txt"
        lines = iter(open(FILE_NAME, "r").read().splitlines())
        get_input = lambda: next(lines)
    else:
        get_input = input

    n_test_cases = int(get_input())
    for _ in range(n_test_cases):
        solution = Solution()
        a, b, c = get_input(), get_input(), get_input()
        print(solution.solve(a, b, c))


Solution 2 (runtime: 671 ms):
for _ in range(int(input())):
    a=input()
    b=input()
    c=input()
    A=len(a)
    B=len(b)
    C=len(c)
    dp=[[10**10 for _ in range(A+1)]for _ in range(C+1)]
    dp[0][0]=0
    for i in range(C):
        for j in range(A+1):
            if j<A:
                if c[i]==a[j]:
                    dp[i+1][j+1]=min(dp[i][j],dp[i+1][j+1])
                else:
                    dp[i+1][j+1]=min(dp[i][j]+1,dp[i+1][j+1])
            if 0<=i-j<B:
                if c[i]==b[i-j]:
                    dp[i+1][j]=min(dp[i][j],dp[i+1][j])
                else:
                    dp[i+1][j]=min(dp[i][j]+1,dp[i+1][j])
    print(min(dp[-1]))
Problem: 2050E - Three Strings
Language: python

Solution 1 (runtime: 1374 ms):
FILE = False


class Solution:
    def __init__(self) -> None:
        pass

    def solve(self, a: str, b: str, c: str) -> int:
        dp = [[0 for _ in range(len(b) + 1)] for _ in range(len(a) + 1)]

        top_row = dp[0]
        for i_b in range(1, len(b) + 1):
            i_c = i_b
            top_row[i_b] = top_row[i_b - 1] + (1 if c[i_c - 1] != b[i_b - 1] else 0)

        for i_a in range(1, len(a) + 1):
            i_c = i_a
            dp[i_a][0] = dp[i_a - 1][0] + (1 if c[i_c - 1] != a[i_a - 1] else 0)

        for i_a in range(1, len(a) + 1):
            for i_b in range(1, len(b) + 1):
                i_c = i_a + i_b
                dp[i_a][i_b] = min(
                    dp[i_a - 1][i_b] + (1 if c[i_c - 1] != a[i_a - 1] else 0),
                    dp[i_a][i_b - 1] + (1 if c[i_c - 1] != b[i_b - 1] else 0),
                )

        return dp[-1][-1]


if __name__ == "__main__":
    if FILE:
        FILE_NAME = "CF_991_div3/inputs/e.txt"
        lines = iter(open(FILE_NAME, "r").read().splitlines())
        get_input = lambda: next(lines)
    else:
        get_input = input

    n_test_cases = int(get_input())
    for _ in range(n_test_cases):
        solution = Solution()
        a, b, c = get_input(), get_input(), get_input()
        print(solution.solve(a, b, c))


Solution 2 (runtime: 390 ms):
def min_changes(a, b, c):

    n, m = len(a), len(b)

    

    # DP array

    dp = [[float('inf')] * (m + 1) for _ in range(n + 1)]

    dp[0][0] = 0

    

    for i in range(n + 1):

        for j in range(m + 1):

            # Skip invalid states

            if dp[i][j] == float('inf'):

                continue

            

            k = i + j  # Position in c

            

            # We can take the next character from a

            if i < n:

                cost = 0 if a[i] == c[k] else 1

                dp[i+1][j] = min(dp[i+1][j], dp[i][j] + cost)

            

            # We can take the next character from b

            if j < m:

                cost = 0 if b[j] == c[k] else 1

                dp[i][j+1] = min(dp[i][j+1], dp[i][j] + cost)

    

    return dp[n][m]



def main():

    t = int(input())

    

    for _ in range(t):

        a = input().strip()

        b = input().strip()

        c = input().strip()

        

        print(min_changes(a, b, c))



if __name__ == "__main__":

    main()
Problem: 2050E - Three Strings
Language: python

Solution 1 (runtime: 1374 ms):
FILE = False


class Solution:
    def __init__(self) -> None:
        pass

    def solve(self, a: str, b: str, c: str) -> int:
        dp = [[0 for _ in range(len(b) + 1)] for _ in range(len(a) + 1)]

        top_row = dp[0]
        for i_b in range(1, len(b) + 1):
            i_c = i_b
            top_row[i_b] = top_row[i_b - 1] + (1 if c[i_c - 1] != b[i_b - 1] else 0)

        for i_a in range(1, len(a) + 1):
            i_c = i_a
            dp[i_a][0] = dp[i_a - 1][0] + (1 if c[i_c - 1] != a[i_a - 1] else 0)

        for i_a in range(1, len(a) + 1):
            for i_b in range(1, len(b) + 1):
                i_c = i_a + i_b
                dp[i_a][i_b] = min(
                    dp[i_a - 1][i_b] + (1 if c[i_c - 1] != a[i_a - 1] else 0),
                    dp[i_a][i_b - 1] + (1 if c[i_c - 1] != b[i_b - 1] else 0),
                )

        return dp[-1][-1]


if __name__ == "__main__":
    if FILE:
        FILE_NAME = "CF_991_div3/inputs/e.txt"
        lines = iter(open(FILE_NAME, "r").read().splitlines())
        get_input = lambda: next(lines)
    else:
        get_input = input

    n_test_cases = int(get_input())
    for _ in range(n_test_cases):
        solution = Solution()
        a, b, c = get_input(), get_input(), get_input()
        print(solution.solve(a, b, c))


Solution 2 (runtime: 186 ms):
t = int(input())

for _ in range(t):

    a = input()

    b = input()

    c = input()

    n = len(a)

    m = len(b)



    ## 背包？？ 区间？？X

    ## 搜索 2**n X

    ##状态转移 dp？？题解 QWQ

    dp = [[0for i in range(m+1)]for i in range(n+1)]

    for i in range(n):

        dp[i+1][0] = dp[i][0]+(c[i]!=a[i])

    for j in range(m):

        dp[0][j+1] = dp[0][j]+(c[j]!=b[j])

    for i in range(n):

        for j in range(m):

            dp[i+1][j+1] = min(dp[i][j+1]+(a[i]!=c[i+j+1]),dp[i+1][j]+(b[j]!=c[i+j+1]))

    print(dp[n][m])
Problem: 2050E - Three Strings
Language: python

Solution 1 (runtime: 1781 ms):
def solve():
    # Read input strings
    s1 = input()
    s2 = input()
    s3 = input()
    
    n = len(s1)
    m = len(s2)
    
    # If lengths don't match the requirements, it's impossible
    if len(s3) != n + m:
        print(-1)
        return
        
    # Create DP table
    dp = [[float('inf')] * (m + 1) for _ in range(n + 1)]
    dp[0][0] = 0  # Base case: empty strings need 0 changes
    
    # Fill dp table
    for i in range(n + 1):
        for j in range(m + 1):
            if i + j == 0:
                continue
                
            # Current position in s3 we're trying to match
            k = i + j - 1
            
            # Try taking from s1
            if i > 0:
                cost = 0 if s1[i-1] == s3[k] else 1
                dp[i][j] = min(dp[i][j], dp[i-1][j] + cost)
            
            # Try taking from s2
            if j > 0:
                cost = 0 if s2[j-1] == s3[k] else 1
                dp[i][j] = min(dp[i][j], dp[i][j-1] + cost)
    
    # Answer is in dp[n][m]
    ans = dp[n][m]
    print(ans if ans != float('inf') else -1)

if __name__ == '__main__':
    t = int(input())
    while t > 0:
        solve()
        t -= 1





Solution 2 (runtime: 186 ms):
t=int(input())
for _ in range(t):
  a=input()
  b=input()
  c=input()
  ans=float('inf')
  dp=[[-1 for i in range(len(b)+1)] for j in range(len(a)+1)]
  dp[0][0]=0
  for i in range(1,len(b)+1):
    dp[0][i]=dp[0][i-1]+ (b[i-1]!=c[i-1])
  for i in range(1,len(a)+1):
    dp[i][0]=dp[i-1][0]+(a[i-1]!=c[i-1])
  for i in range(1,len(a)+1):
    for j in range(1,len(b)+1):
      p=dp[i-1][j]+(a[i-1]!=c[i+j-1])
      q=dp[i][j-1]+(b[j-1]!=c[i+j-1])
      dp[i][j]=min(p,q)
  print(dp[len(a)][len(b)])
Problem: 2050E - Three Strings
Language: python

Solution 1 (runtime: 1781 ms):
def solve():
    # Read input strings
    s1 = input()
    s2 = input()
    s3 = input()
    
    n = len(s1)
    m = len(s2)
    
    # If lengths don't match the requirements, it's impossible
    if len(s3) != n + m:
        print(-1)
        return
        
    # Create DP table
    dp = [[float('inf')] * (m + 1) for _ in range(n + 1)]
    dp[0][0] = 0  # Base case: empty strings need 0 changes
    
    # Fill dp table
    for i in range(n + 1):
        for j in range(m + 1):
            if i + j == 0:
                continue
                
            # Current position in s3 we're trying to match
            k = i + j - 1
            
            # Try taking from s1
            if i > 0:
                cost = 0 if s1[i-1] == s3[k] else 1
                dp[i][j] = min(dp[i][j], dp[i-1][j] + cost)
            
            # Try taking from s2
            if j > 0:
                cost = 0 if s2[j-1] == s3[k] else 1
                dp[i][j] = min(dp[i][j], dp[i][j-1] + cost)
    
    # Answer is in dp[n][m]
    ans = dp[n][m]
    print(ans if ans != float('inf') else -1)

if __name__ == '__main__':
    t = int(input())
    while t > 0:
        solve()
        t -= 1





Solution 2 (runtime: 281 ms):
def min_changes(a, b, c):
    len_a = len(a)
    len_b = len(b)
    len_c = len(c)
    
    # Initialize the DP table
    dp = [[float('inf')] * (len_b + 1) for _ in range(len_a + 1)]
    dp[0][0] = 0  # Base case, no change needed for empty strings
    
    # Fill the DP table
    for i in range(len_a + 1):
        for j in range(len_b + 1):
            if i + j > len_c:
                continue
            if i < len_a and a[i] == c[i + j]:
                dp[i + 1][j] = min(dp[i + 1][j], dp[i][j])
            if j < len_b and b[j] == c[i + j]:
                dp[i][j + 1] = min(dp[i][j + 1], dp[i][j])
            if i < len_a and a[i] != c[i + j]:
                dp[i + 1][j] = min(dp[i + 1][j], dp[i][j] + 1)
            if j < len_b and b[j] != c[i + j]:
                dp[i][j + 1] = min(dp[i][j + 1], dp[i][j] + 1)
    
    return dp[len_a][len_b]

# Input
t = int(input())  # Number of test cases
for _ in range(t):
    a = input().strip()  # First string
    b = input().strip()  # Second string
    c = input().strip()  # Third string
    
    # Compute the result
    result = min_changes(a, b, c)
    
    # Output the result
    print(result)
Problem: 2050E - Three Strings
Language: python

Solution 1 (runtime: 1781 ms):
def solve():
    # Read input strings
    s1 = input()
    s2 = input()
    s3 = input()
    
    n = len(s1)
    m = len(s2)
    
    # If lengths don't match the requirements, it's impossible
    if len(s3) != n + m:
        print(-1)
        return
        
    # Create DP table
    dp = [[float('inf')] * (m + 1) for _ in range(n + 1)]
    dp[0][0] = 0  # Base case: empty strings need 0 changes
    
    # Fill dp table
    for i in range(n + 1):
        for j in range(m + 1):
            if i + j == 0:
                continue
                
            # Current position in s3 we're trying to match
            k = i + j - 1
            
            # Try taking from s1
            if i > 0:
                cost = 0 if s1[i-1] == s3[k] else 1
                dp[i][j] = min(dp[i][j], dp[i-1][j] + cost)
            
            # Try taking from s2
            if j > 0:
                cost = 0 if s2[j-1] == s3[k] else 1
                dp[i][j] = min(dp[i][j], dp[i][j-1] + cost)
    
    # Answer is in dp[n][m]
    ans = dp[n][m]
    print(ans if ans != float('inf') else -1)

if __name__ == '__main__':
    t = int(input())
    while t > 0:
        solve()
        t -= 1





Solution 2 (runtime: 2389 ms):
az = int(input())
for _ in range(az):
    s1 = input()
    s2 = input()
    s3 = input()

    if len(s1) + len(s2) != len(s3):
        print(-1)
        continue

    # DP table to store minimum cost
    dp = [[float('inf')] * (len(s2) + 1) for _ in range(len(s1) + 1)]
    dp[0][0] = 0

    # Fill the DP table
    for i in range(len(s1) + 1):
        for j in range(len(s2) + 1):
            if i > 0:  # Taking a character from s1
                dp[i][j] = min(dp[i][j], dp[i - 1][j] + (s1[i - 1] != s3[i + j - 1]))
            if j > 0:  # Taking a character from s2
                dp[i][j] = min(dp[i][j], dp[i][j - 1] + (s2[j - 1] != s3[i + j - 1]))

    # Output the result for this test case
    print(dp[len(s1)][len(s2)])
Problem: 2050E - Three Strings
Language: python

Solution 1 (runtime: 1781 ms):
def solve():
    # Read input strings
    s1 = input()
    s2 = input()
    s3 = input()
    
    n = len(s1)
    m = len(s2)
    
    # If lengths don't match the requirements, it's impossible
    if len(s3) != n + m:
        print(-1)
        return
        
    # Create DP table
    dp = [[float('inf')] * (m + 1) for _ in range(n + 1)]
    dp[0][0] = 0  # Base case: empty strings need 0 changes
    
    # Fill dp table
    for i in range(n + 1):
        for j in range(m + 1):
            if i + j == 0:
                continue
                
            # Current position in s3 we're trying to match
            k = i + j - 1
            
            # Try taking from s1
            if i > 0:
                cost = 0 if s1[i-1] == s3[k] else 1
                dp[i][j] = min(dp[i][j], dp[i-1][j] + cost)
            
            # Try taking from s2
            if j > 0:
                cost = 0 if s2[j-1] == s3[k] else 1
                dp[i][j] = min(dp[i][j], dp[i][j-1] + cost)
    
    # Answer is in dp[n][m]
    ans = dp[n][m]
    print(ans if ans != float('inf') else -1)

if __name__ == '__main__':
    t = int(input())
    while t > 0:
        solve()
        t -= 1





Solution 2 (runtime: 218 ms):
import os
import sys
import math
from collections import defaultdict




IS_LOCAL = False
try:
    current_directory = os.path.dirname(os.path.abspath(__file__))
    if 'cp_cursed' in current_directory:
        IS_LOCAL = True
except NameError:
    pass
if IS_LOCAL:
    sys.stdout=open('outputf.in', 'w')
    sys.stdin=open('inputf.in', 'r')

lol=lambda func=int: list(map(func, sys.stdin.readline().split()))
lol1=lambda: sys.stdin.readline().split()


T=lol()[0]
for _ in range(T):
    s1=lol1()[0]
    s2=lol1()[0]
    s3=lol1()[0]
    dp=[[i+j for j in range(len(s2)+1)] for i in range(len(s1)+1)]
    for i in range(-1, len(s1)):
        for j in range(-1, len(s2)):            
            if i!=-1:
                if s1[i]==s3[i+j+1]:
                    dp[i+1][j+1]=min(dp[i+1][j+1],dp[i][j+1])
                dp[i+1][j+1]=min(dp[i+1][j+1],dp[i][j+1]+1)
            if j!=-1:
                if s2[j]==s3[i+j+1]:
                    dp[i+1][j+1]=min(dp[i+1][j+1],dp[i+1][j])
                dp[i+1][j+1]=min(dp[i+1][j+1],dp[i+1][j]+1)
    print(dp[-1][-1])
Problem: 2050E - Three Strings
Language: python

Solution 1 (runtime: 1781 ms):
def solve():
    # Read input strings
    s1 = input()
    s2 = input()
    s3 = input()
    
    n = len(s1)
    m = len(s2)
    
    # If lengths don't match the requirements, it's impossible
    if len(s3) != n + m:
        print(-1)
        return
        
    # Create DP table
    dp = [[float('inf')] * (m + 1) for _ in range(n + 1)]
    dp[0][0] = 0  # Base case: empty strings need 0 changes
    
    # Fill dp table
    for i in range(n + 1):
        for j in range(m + 1):
            if i + j == 0:
                continue
                
            # Current position in s3 we're trying to match
            k = i + j - 1
            
            # Try taking from s1
            if i > 0:
                cost = 0 if s1[i-1] == s3[k] else 1
                dp[i][j] = min(dp[i][j], dp[i-1][j] + cost)
            
            # Try taking from s2
            if j > 0:
                cost = 0 if s2[j-1] == s3[k] else 1
                dp[i][j] = min(dp[i][j], dp[i][j-1] + cost)
    
    # Answer is in dp[n][m]
    ans = dp[n][m]
    print(ans if ans != float('inf') else -1)

if __name__ == '__main__':
    t = int(input())
    while t > 0:
        solve()
        t -= 1





Solution 2 (runtime: 1467 ms):

def solve(a,b,c):
	dp = [[0] * (len(b) + 1) for _ in (range(len(a)+1))]

	d = 0
	for i in reversed(range(0,len(a))):
		if a[i] != c[i+len(b)]:
			d += 1
		dp[i][len(b)] = d
	d = 0
	for j in reversed(range(0,len(b))):
		if b[j] != c[len(a)+j]:
			d += 1
		dp[len(a)][j] = d

	for k in reversed(range(0,len(a)+len(b)-1)):
		x0 = max(0,k-(len(b)-1))
		x1 = min(k,(len(a)-1))
		for i in range(x0,x1+1):
			j = k-i
			res = None
			if i == len(a):
				res = sum(map(lambda x: x[0]!=x[1], zip(iter(b[j:]),iter(c[i+j:]))))
			elif j == len(b):
				res = sum(map(lambda x: x[0]!=x[1], zip(iter(a[i:]),iter(c[i+j:]))))
			else:
				res = min(
					dp[i+1][j] + (0 if a[i] == c[i+j] else 1),
					dp[i][j+1] + (0 if b[j] == c[i+j] else 1)
				)

			dp[i][j] = res

	return dp[0][0]

def test():
	print(solve("a","b","cb"))
	print(solve("ab","cd","acbd"))
	print(solve("ab","ba","aabb"))
	print(solve("xxx","yyy","xyxyxy"))
	print(solve("a","bcd","decf"))
	print(solve("codes","horse","codeforces"))
	print(solve("egg","annie","egaegaeg"))
	exit()

for _ in range(int(input())):
	print(solve(input(),input(),input()))