int makeEqual(char *s1, int n1, char *s2, int n2) {
  int count = 0;
  for (int i = 0; i < n1; i++) {
    int flag = 1;
    for (int j = 0; j < n2; j++) {
      if ((*(s1 + i) == *(s2 + j)) && (*(s1 + i) != '0') &&
          (*(s2 + j) != '0')) {
        flag = 0;
        *(s1 + i) = '0';
        *(s2 + j) = '0';
        break;
      }
    }
    if (flag == 1) {
      count++;
    }
  }
  for (int i = 0; i < n2; i++) {
    int flag = 1;
    for (int j = 0; j < n1; j++) {
      if ((*(s2 + i) == *(s1 + j)) && (*(s1 + i) != '0') &&
          (*(s2 + j) != '0')) {
        flag = 0;
        *(s2 + i) = '0';
        *(s1 + j) = '0';
        break;
      }
    }
    if (flag == 1) {
      count++;
    }
  }
  return count;
}


x86 assembly (clang, -O0):
<makeEqual>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %ecx,-0x1c(%rbp)
movl   $0x0,-0x20(%rbp)
movl   $0x0,-0x24(%rbp)
mov    -0x24(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    11ed <makeEqual+0xed>
movl   $0x1,-0x28(%rbp)
movl   $0x0,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x1c(%rbp),%eax
jge    11c7 <makeEqual+0xc7>
mov    -0x8(%rbp),%rax
movslq -0x24(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
mov    -0x18(%rbp),%rcx
movslq -0x2c(%rbp),%rdx
movsbl (%rcx,%rdx,1),%ecx
cmp    %ecx,%eax
jne    11b4 <makeEqual+0xb4>
mov    -0x8(%rbp),%rax
movslq -0x24(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x30,%eax
je     11b4 <makeEqual+0xb4>
mov    -0x18(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x30,%eax
je     11b4 <makeEqual+0xb4>
movl   $0x0,-0x28(%rbp)
mov    -0x8(%rbp),%rax
movslq -0x24(%rbp),%rcx
movb   $0x30,(%rax,%rcx,1)
mov    -0x18(%rbp),%rax
movslq -0x2c(%rbp),%rcx
movb   $0x30,(%rax,%rcx,1)
jmp    11c7 <makeEqual+0xc7>
jmp    11b9 <makeEqual+0xb9>
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    113a <makeEqual+0x3a>
cmpl   $0x1,-0x28(%rbp)
jne    11da <makeEqual+0xda>
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    11df <makeEqual+0xdf>
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    1120 <makeEqual+0x20>
movl   $0x0,-0x30(%rbp)
mov    -0x30(%rbp),%eax
cmp    -0x1c(%rbp),%eax
jge    12c1 <makeEqual+0x1c1>
movl   $0x1,-0x34(%rbp)
movl   $0x0,-0x38(%rbp)
mov    -0x38(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    129b <makeEqual+0x19b>
mov    -0x18(%rbp),%rax
movslq -0x30(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
mov    -0x8(%rbp),%rcx
movslq -0x38(%rbp),%rdx
movsbl (%rcx,%rdx,1),%ecx
cmp    %ecx,%eax
jne    1288 <makeEqual+0x188>
mov    -0x8(%rbp),%rax
movslq -0x30(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x30,%eax
je     1288 <makeEqual+0x188>
mov    -0x18(%rbp),%rax
movslq -0x38(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x30,%eax
je     1288 <makeEqual+0x188>
movl   $0x0,-0x34(%rbp)
mov    -0x18(%rbp),%rax
movslq -0x30(%rbp),%rcx
movb   $0x30,(%rax,%rcx,1)
mov    -0x8(%rbp),%rax
movslq -0x38(%rbp),%rcx
movb   $0x30,(%rax,%rcx,1)
jmp    129b <makeEqual+0x19b>
jmp    128d <makeEqual+0x18d>
mov    -0x38(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x38(%rbp)
jmp    120e <makeEqual+0x10e>
cmpl   $0x1,-0x34(%rbp)
jne    12ae <makeEqual+0x1ae>
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    12b3 <makeEqual+0x1b3>
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
jmp    11f4 <makeEqual+0xf4>
mov    -0x20(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<makeEqual>:
push   %rbp
push   %r14
push   %rbx
mov    %esi,%r8d
mov    %ecx,%r9d
test   %esi,%esi
jle    11b6 <makeEqual+0xb6>
movslq %ecx,%r10
xor    %r11d,%r11d
xor    %eax,%eax
jmp    1139 <makeEqual+0x39>
nopl   0x0(%rax)
xor    %ebp,%ebp
xor    $0x1,%bpl
movzbl %bpl,%ebx
add    %ebx,%eax
add    $0x1,%r11
cmp    %r8,%r11
je     11b8 <makeEqual+0xb8>
test   %ecx,%ecx
jle    1120 <makeEqual+0x20>
mov    (%rdi,%r11,1),%bpl
mov    (%rdx),%bl
cmp    $0x30,%bl
je     1160 <makeEqual+0x60>
cmp    $0x30,%bpl
je     1160 <makeEqual+0x60>
cmp    %bl,%bpl
jne    1160 <makeEqual+0x60>
mov    $0x1,%bpl
xor    %ebx,%ebx
jmp    119a <makeEqual+0x9a>
nopw   0x0(%rax,%rax,1)
mov    $0x1,%ebx
cs nopw 0x0(%rax,%rax,1)
nop
cmp    %rbx,%r9
je     11aa <makeEqual+0xaa>
movzbl (%rdx,%rbx,1),%r14d
add    $0x1,%rbx
cmp    $0x30,%r14b
je     1170 <makeEqual+0x70>
cmp    $0x30,%bpl
je     1170 <makeEqual+0x70>
cmp    %r14b,%bpl
jne    1170 <makeEqual+0x70>
add    $0xffffffffffffffff,%rbx
cmp    %r10,%rbx
setl   %bpl
mov    %ebx,%ebx
movb   $0x30,(%rdi,%r11,1)
movb   $0x30,(%rdx,%rbx,1)
jmp    1122 <makeEqual+0x22>
cmp    %r10,%rbx
setl   %bpl
jmp    1122 <makeEqual+0x22>
xor    %eax,%eax
test   %ecx,%ecx
jle    1239 <makeEqual+0x139>
movslq %esi,%r10
neg    %r8
xor    %r11d,%r11d
jmp    11e5 <makeEqual+0xe5>
nopl   0x0(%rax,%rax,1)
xor    %ecx,%ecx
not    %cl
movzbl %cl,%ecx
and    $0x1,%ecx
add    %ecx,%eax
add    $0x1,%r11
cmp    %r9,%r11
je     1239 <makeEqual+0x139>
test   %esi,%esi
jle    11d0 <makeEqual+0xd0>
mov    (%rdx,%r11,1),%r14b
mov    $0x1,%cl
mov    $0x1,%ebx
jmp    1218 <makeEqual+0x118>
cs nopw 0x0(%rax,%rax,1)
cmp    %r10,%rbx
setl   %cl
lea    (%r8,%rbx,1),%rbp
add    $0x1,%rbp
add    $0x1,%rbx
cmp    $0x1,%rbp
je     11d2 <makeEqual+0xd2>
cmp    -0x1(%rdi,%rbx,1),%r14b
jne    1200 <makeEqual+0x100>
cmpb   $0x30,(%rdi,%r11,1)
je     1200 <makeEqual+0x100>
cmpb   $0x30,-0x1(%rdx,%rbx,1)
je     1200 <makeEqual+0x100>
movb   $0x30,(%rdx,%r11,1)
movb   $0x30,-0x1(%rdi,%rbx,1)
jmp    11d2 <makeEqual+0xd2>
pop    %rbx
pop    %r14
pop    %rbp
ret

LLVM IR (-O0):
define i32 @makeEqual(i8* %0, i32 %1, i8* %2, i32 %3) {
%5 = alloca i8*
%6 = alloca i32
%7 = alloca i8*
%8 = alloca i32
%9 = alloca i32
%10 = alloca i32
%11 = alloca i32
%12 = alloca i32
%13 = alloca i32
%14 = alloca i32
%15 = alloca i32
store i8* %0, i8** %5
store i32 %1, i32* %6
store i8* %2, i8** %7
store i32 %3, i32* %8
store i32 0, i32* %9
store i32 0, i32* %10
br label %16
16: ; preds = %75, %4
%17 = load i32, i32* %10
%18 = load i32, i32* %6
%19 = icmp slt i32 %17, %18
br i1 %19, label %20, label %78
20: ; preds = %16
store i32 1, i32* %11
store i32 0, i32* %12
br label %21
21: ; preds = %65, %20
%22 = load i32, i32* %12
%23 = load i32, i32* %8
%24 = icmp slt i32 %22, %23
br i1 %24, label %25, label %68
25: ; preds = %21
%26 = load i8*, i8** %5
%27 = load i32, i32* %10
%28 = sext i32 %27 to i64
%29 = getelementptr inbounds i8, i8* %26, i64 %28
%30 = load i8, i8* %29
%31 = sext i8 %30 to i32
%32 = load i8*, i8** %7
%33 = load i32, i32* %12
%34 = sext i32 %33 to i64
%35 = getelementptr inbounds i8, i8* %32, i64 %34
%36 = load i8, i8* %35
%37 = sext i8 %36 to i32
%38 = icmp eq i32 %31, %37
br i1 %38, label %39, label %64
39: ; preds = %25
%40 = load i8*, i8** %5
%41 = load i32, i32* %10
%42 = sext i32 %41 to i64
%43 = getelementptr inbounds i8, i8* %40, i64 %42
%44 = load i8, i8* %43
%45 = sext i8 %44 to i32
%46 = icmp ne i32 %45, 48
br i1 %46, label %47, label %64
47: ; preds = %39
%48 = load i8*, i8** %7
%49 = load i32, i32* %12
%50 = sext i32 %49 to i64
%51 = getelementptr inbounds i8, i8* %48, i64 %50
%52 = load i8, i8* %51
%53 = sext i8 %52 to i32
%54 = icmp ne i32 %53, 48
br i1 %54, label %55, label %64
55: ; preds = %47
store i32 0, i32* %11
%56 = load i8*, i8** %5
%57 = load i32, i32* %10
%58 = sext i32 %57 to i64
%59 = getelementptr inbounds i8, i8* %56, i64 %58
store i8 48, i8* %59
%60 = load i8*, i8** %7
%61 = load i32, i32* %12
%62 = sext i32 %61 to i64
%63 = getelementptr inbounds i8, i8* %60, i64 %62
store i8 48, i8* %63
br label %68
64: ; preds = %47, %39, %25
br label %65
65: ; preds = %64
%66 = load i32, i32* %12
%67 = add nsw i32 %66, 1
store i32 %67, i32* %12
br label %21
68: ; preds = %55, %21
%69 = load i32, i32* %11
%70 = icmp eq i32 %69, 1
br i1 %70, label %71, label %74
71: ; preds = %68
%72 = load i32, i32* %9
%73 = add nsw i32 %72, 1
store i32 %73, i32* %9
br label %74
74: ; preds = %71, %68
br label %75
75: ; preds = %74
%76 = load i32, i32* %10
%77 = add nsw i32 %76, 1
store i32 %77, i32* %10
br label %16
78: ; preds = %16
store i32 0, i32* %13
br label %79
79: ; preds = %138, %78
%80 = load i32, i32* %13
%81 = load i32, i32* %8
%82 = icmp slt i32 %80, %81
br i1 %82, label %83, label %141
83: ; preds = %79
store i32 1, i32* %14
store i32 0, i32* %15
br label %84
84: ; preds = %128, %83
%85 = load i32, i32* %15
%86 = load i32, i32* %6
%87 = icmp slt i32 %85, %86
br i1 %87, label %88, label %131
88: ; preds = %84
%89 = load i8*, i8** %7
%90 = load i32, i32* %13
%91 = sext i32 %90 to i64
%92 = getelementptr inbounds i8, i8* %89, i64 %91
%93 = load i8, i8* %92
%94 = sext i8 %93 to i32
%95 = load i8*, i8** %5
%96 = load i32, i32* %15
%97 = sext i32 %96 to i64
%98 = getelementptr inbounds i8, i8* %95, i64 %97
%99 = load i8, i8* %98
%100 = sext i8 %99 to i32
%101 = icmp eq i32 %94, %100
br i1 %101, label %102, label %127
102: ; preds = %88
%103 = load i8*, i8** %5
%104 = load i32, i32* %13
%105 = sext i32 %104 to i64
%106 = getelementptr inbounds i8, i8* %103, i64 %105
%107 = load i8, i8* %106
%108 = sext i8 %107 to i32
%109 = icmp ne i32 %108, 48
br i1 %109, label %110, label %127
110: ; preds = %102
%111 = load i8*, i8** %7
%112 = load i32, i32* %15
%113 = sext i32 %112 to i64
%114 = getelementptr inbounds i8, i8* %111, i64 %113
%115 = load i8, i8* %114
%116 = sext i8 %115 to i32
%117 = icmp ne i32 %116, 48
br i1 %117, label %118, label %127
118: ; preds = %110
store i32 0, i32* %14
%119 = load i8*, i8** %7
%120 = load i32, i32* %13
%121 = sext i32 %120 to i64
%122 = getelementptr inbounds i8, i8* %119, i64 %121
store i8 48, i8* %122
%123 = load i8*, i8** %5
%124 = load i32, i32* %15
%125 = sext i32 %124 to i64
%126 = getelementptr inbounds i8, i8* %123, i64 %125
store i8 48, i8* %126
br label %131
127: ; preds = %110, %102, %88
br label %128
128: ; preds = %127
%129 = load i32, i32* %15
%130 = add nsw i32 %129, 1
store i32 %130, i32* %15
br label %84
131: ; preds = %118, %84
%132 = load i32, i32* %14
%133 = icmp eq i32 %132, 1
br i1 %133, label %134, label %137
134: ; preds = %131
%135 = load i32, i32* %9
%136 = add nsw i32 %135, 1
store i32 %136, i32* %9
br label %137
137: ; preds = %134, %131
br label %138
138: ; preds = %137
%139 = load i32, i32* %13
%140 = add nsw i32 %139, 1
store i32 %140, i32* %13
br label %79
141: ; preds = %79
%142 = load i32, i32* %9
ret i32 %142
}

LLVM IR (-O2):
define i32 @makeEqual(i8* nocapture %0, i32 %1, i8* nocapture %2, i32 %3) {
%5 = icmp sgt i32 %1, 0
br i1 %5, label %6, label %23
6: ; preds = %4
%7 = icmp sgt i32 %3, 0
%8 = sext i32 %3 to i64
%9 = zext i32 %1 to i64
%10 = zext i32 %3 to i64
br label %11
11: ; preds = %6, %50
%12 = phi i64 [ 0, %6 ], [ %55, %50 ]
%13 = phi i32 [ 0, %6 ], [ %54, %50 ]
br i1 %7, label %14, label %50
14: ; preds = %11
%15 = getelementptr inbounds i8, i8* %0, i64 %12
%16 = load i8, i8* %15
%17 = icmp eq i8 %16, 48
%18 = load i8, i8* %2
%19 = icmp ne i8 %16, %18
%20 = or i1 %17, %19
%21 = icmp eq i8 %18, 48
%22 = or i1 %21, %20
br i1 %22, label %44, label %39
23: ; preds = %50, %4
%24 = phi i32 [ 0, %4 ], [ %54, %50 ]
%25 = icmp sgt i32 %3, 0
br i1 %25, label %26, label %64
26: ; preds = %23
%27 = sext i32 %1 to i64
%28 = zext i32 %3 to i64
%29 = zext i32 %1 to i64
br label %57
30: ; preds = %44
%31 = getelementptr inbounds i8, i8* %2, i64 %46
%32 = load i8, i8* %31
%33 = icmp ne i8 %16, %32
%34 = or i1 %17, %33
%35 = icmp eq i8 %32, 48
%36 = or i1 %35, %34
br i1 %36, label %44, label %37
37: ; preds = %30
%38 = icmp slt i64 %46, %8
br label %39
39: ; preds = %37, %14
%40 = phi i64 [ 0, %14 ], [ %46, %37 ]
%41 = phi i1 [ true, %14 ], [ %38, %37 ]
%42 = and i64 %40, 4294967295
%43 = getelementptr inbounds i8, i8* %2, i64 %42
store i8 48, i8* %15
store i8 48, i8* %43
br label %50
44: ; preds = %14, %30
%45 = phi i64 [ %46, %30 ], [ 0, %14 ]
%46 = add nuw nsw i64 %45, 1
%47 = icmp eq i64 %46, %10
br i1 %47, label %48, label %30
48: ; preds = %44
%49 = icmp slt i64 %46, %8
br label %50
50: ; preds = %48, %11, %39
%51 = phi i1 [ %41, %39 ], [ false, %11 ], [ %49, %48 ]
%52 = xor i1 %51, true
%53 = zext i1 %52 to i32
%54 = add nuw nsw i32 %13, %53
%55 = add nuw nsw i64 %12, 1
%56 = icmp eq i64 %55, %9
br i1 %56, label %23, label %11
57: ; preds = %26, %86
%58 = phi i64 [ 0, %26 ], [ %91, %86 ]
%59 = phi i32 [ %24, %26 ], [ %90, %86 ]
br i1 %5, label %60, label %86
60: ; preds = %57
%61 = getelementptr inbounds i8, i8* %2, i64 %58
%62 = load i8, i8* %61
%63 = getelementptr inbounds i8, i8* %0, i64 %58
br label %66
64: ; preds = %86, %23
%65 = phi i32 [ %24, %23 ], [ %90, %86 ]
ret i32 %65
66: ; preds = %60, %82
%67 = phi i64 [ 0, %60 ], [ %83, %82 ]
%68 = phi i1 [ true, %60 ], [ %84, %82 ]
%69 = getelementptr inbounds i8, i8* %0, i64 %67
%70 = load i8, i8* %69
%71 = icmp eq i8 %62, %70
br i1 %71, label %72, label %82
72: ; preds = %66
%73 = load i8, i8* %63
%74 = icmp eq i8 %73, 48
br i1 %74, label %82, label %75
75: ; preds = %72
%76 = getelementptr inbounds i8, i8* %2, i64 %67
%77 = load i8, i8* %76
%78 = icmp eq i8 %77, 48
br i1 %78, label %82, label %79
79: ; preds = %75
%80 = and i64 %67, 4294967295
%81 = getelementptr inbounds i8, i8* %0, i64 %80
store i8 48, i8* %61
store i8 48, i8* %81
br label %86
82: ; preds = %66, %72, %75
%83 = add nuw nsw i64 %67, 1
%84 = icmp slt i64 %83, %27
%85 = icmp eq i64 %83, %29
br i1 %85, label %86, label %66
86: ; preds = %82, %57, %79
%87 = phi i1 [ %68, %79 ], [ false, %57 ], [ %84, %82 ]
%88 = xor i1 %87, true
%89 = zext i1 %88 to i32
%90 = add nuw nsw i32 %59, %89
%91 = add nuw nsw i64 %58, 1
%92 = icmp eq i64 %91, %28
br i1 %92, label %64, label %57
}