#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */

/* Variables and functions */
int EXIT_FAILURE;
int EXIT_SUCCESS;
int /*<<< orphan*/ printf(char *, int, int);
int scanf(char *, char **);
int strlen(char *);
int main(int argc, char *argv[]) {
  char str[1001];
  if (scanf("%s", &str) != 1)
    return EXIT_FAILURE;
  int len_str = strlen(str);
  int stat[10] = {0};
  for (int i = 0; i < len_str; i++) {
    stat[str[i] - '0']++;
  }
  for (int i = 0; i < 10; i++) {
    if (stat[i] > 0) {
      printf("%d:%d\n", i, stat[i]);
    }
  }
  return EXIT_SUCCESS;
}


x86 assembly (clang, -O0):
<main>:
push   %rbp
mov    %rsp,%rbp
sub    $0x440,%rsp
movl   $0x0,-0x4(%rbp)
mov    %edi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
lea    -0x400(%rbp),%rsi
lea    0xe99(%rip),%rdi
call   1060 <scanf@plt>
cmp    $0x1,%eax
je     1186 <main+0x46>
mov    0x2e64(%rip),%rax
mov    (%rax),%eax
mov    %eax,-0x4(%rbp)
jmp    1271 <main+0x131>
lea    -0x400(%rbp),%rdi
call   1030 <strlen@plt>
mov    %eax,-0x404(%rbp)
lea    -0x430(%rbp),%rdi
xor    %esi,%esi
mov    $0x28,%edx
call   1050 <memset@plt>
movl   $0x0,-0x434(%rbp)
mov    -0x434(%rbp),%eax
cmp    -0x404(%rbp),%eax
jge    1200 <main+0xc0>
movslq -0x434(%rbp),%rax
movsbl -0x400(%rbp,%rax,1),%eax
ff
sub    $0x30,%eax
cltq
mov    -0x430(%rbp,%rax,4),%ecx
add    $0x1,%ecx
mov    %ecx,-0x430(%rbp,%rax,4)
mov    -0x434(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x434(%rbp)
jmp    11b5 <main+0x75>
movl   $0x0,-0x438(%rbp)
cmpl   $0xa,-0x438(%rbp)
jge    1265 <main+0x125>
movslq -0x438(%rbp),%rax
cmpl   $0x0,-0x430(%rbp,%rax,4)
jle    124c <main+0x10c>
mov    -0x438(%rbp),%esi
movslq -0x438(%rbp),%rax
mov    -0x430(%rbp,%rax,4),%edx
lea    0xdbc(%rip),%rdi
call   1040 <printf@plt>
jmp    1251 <main+0x111>
mov    -0x438(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x438(%rbp)
jmp    120a <main+0xca>
mov    0x2d6c(%rip),%rax
mov    (%rax),%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x440,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<main>:
sub    $0x428,%rsp
lea    0xec2(%rip),%rdi
lea    0x30(%rsp),%rsi
call   1050 <scanf@plt>
cmp    $0x1,%eax
jne    117b <main+0x4b>
lea    0x30(%rsp),%rdi
call   1030 <strlen@plt>
xorps  %xmm0,%xmm0
movaps %xmm0,0x10(%rsp)
movaps %xmm0,(%rsp)
movq   $0x0,0x20(%rsp)
test   %eax,%eax
jle    11dd <main+0xad>
mov    %eax,%ecx
cmp    $0x1,%eax
jne    1187 <main+0x57>
xor    %eax,%eax
jmp    11b5 <main+0x85>
mov    0x2e5e(%rip),%rax
jmp    12c5 <main+0x195>
mov    %ecx,%edx
and    $0xfffffffe,%edx
xor    %eax,%eax
xchg   %ax,%ax
movsbq 0x30(%rsp,%rax,1),%rsi
addl   $0x1,-0xc0(%rsp,%rsi,4)
01
movsbq 0x31(%rsp,%rax,1),%rsi
addl   $0x1,-0xc0(%rsp,%rsi,4)
01
add    $0x2,%rax
cmp    %rax,%rdx
jne    1190 <main+0x60>
test   $0x1,%cl
je     11c8 <main+0x98>
movsbq 0x30(%rsp,%rax,1),%rax
addl   $0x1,-0xc0(%rsp,%rax,4)
01
mov    (%rsp),%edx
test   %edx,%edx
jle    11dd <main+0xad>
lea    0xe2d(%rip),%rdi
xor    %esi,%esi
call   1040 <printf@plt>
mov    0x4(%rsp),%edx
test   %edx,%edx
jle    11f6 <main+0xc6>
lea    0xe17(%rip),%rdi
mov    $0x1,%esi
call   1040 <printf@plt>
mov    0x8(%rsp),%edx
test   %edx,%edx
jle    120f <main+0xdf>
lea    0xdfe(%rip),%rdi
mov    $0x2,%esi
call   1040 <printf@plt>
mov    0xc(%rsp),%edx
test   %edx,%edx
jle    1228 <main+0xf8>
lea    0xde5(%rip),%rdi
mov    $0x3,%esi
call   1040 <printf@plt>
mov    0x10(%rsp),%edx
test   %edx,%edx
jle    1241 <main+0x111>
lea    0xdcc(%rip),%rdi
mov    $0x4,%esi
call   1040 <printf@plt>
mov    0x14(%rsp),%edx
test   %edx,%edx
jle    125a <main+0x12a>
lea    0xdb3(%rip),%rdi
mov    $0x5,%esi
call   1040 <printf@plt>
mov    0x18(%rsp),%edx
test   %edx,%edx
jle    1273 <main+0x143>
lea    0xd9a(%rip),%rdi
mov    $0x6,%esi
call   1040 <printf@plt>
mov    0x1c(%rsp),%edx
test   %edx,%edx
jle    128c <main+0x15c>
lea    0xd81(%rip),%rdi
mov    $0x7,%esi
call   1040 <printf@plt>
mov    0x20(%rsp),%edx
test   %edx,%edx
jle    12a5 <main+0x175>
lea    0xd68(%rip),%rdi
mov    $0x8,%esi
call   1040 <printf@plt>
mov    0x24(%rsp),%edx
test   %edx,%edx
jle    12be <main+0x18e>
lea    0xd4f(%rip),%rdi
mov    $0x9,%esi
call   1040 <printf@plt>
mov    0x2d13(%rip),%rax
mov    (%rax),%eax
add    $0x428,%rsp
ret

LLVM IR (-O0):
@.str = [3 x i8] c"%s\00"
@EXIT_FAILURE = global i32 0
@.str.1 = [7 x i8] c"%d:%d\0A\00"
@EXIT_SUCCESS = global i32 0
define i32 @main(i32 %0, i8** %1) {
%3 = alloca i32
%4 = alloca i32
%5 = alloca i8**
%6 = alloca [1001 x i8]
%7 = alloca i32
%8 = alloca [10 x i32]
%9 = alloca i32
%10 = alloca i32
store i32 0, i32* %3
store i32 %0, i32* %4
store i8** %1, i8*** %5
%11 = bitcast [1001 x i8]* %6 to i8**
%12 = call i32 @scanf(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str, i64 0, i64 0), i8** %11)
%13 = icmp ne i32 %12, 1
br i1 %13, label %14, label %16
14: ; preds = %2
%15 = load i32, i32* @EXIT_FAILURE
store i32 %15, i32* %3
br label %61
16: ; preds = %2
%17 = getelementptr inbounds [1001 x i8], [1001 x i8]* %6, i64 0, i64 0
%18 = call i32 @strlen(i8* %17)
store i32 %18, i32* %7
%19 = bitcast [10 x i32]* %8 to i8*
store i32 0, i32* %9
br label %20
20: ; preds = %35, %16
%21 = load i32, i32* %9
%22 = load i32, i32* %7
%23 = icmp slt i32 %21, %22
br i1 %23, label %24, label %38
24: ; preds = %20
%25 = load i32, i32* %9
%26 = sext i32 %25 to i64
%27 = getelementptr inbounds [1001 x i8], [1001 x i8]* %6, i64 0, i64 %26
%28 = load i8, i8* %27
%29 = sext i8 %28 to i32
%30 = sub nsw i32 %29, 48
%31 = sext i32 %30 to i64
%32 = getelementptr inbounds [10 x i32], [10 x i32]* %8, i64 0, i64 %31
%33 = load i32, i32* %32
%34 = add nsw i32 %33, 1
store i32 %34, i32* %32
br label %35
35: ; preds = %24
%36 = load i32, i32* %9
%37 = add nsw i32 %36, 1
store i32 %37, i32* %9
br label %20
38: ; preds = %20
store i32 0, i32* %10
br label %39
39: ; preds = %56, %38
%40 = load i32, i32* %10
%41 = icmp slt i32 %40, 10
br i1 %41, label %42, label %59
42: ; preds = %39
%43 = load i32, i32* %10
%44 = sext i32 %43 to i64
%45 = getelementptr inbounds [10 x i32], [10 x i32]* %8, i64 0, i64 %44
%46 = load i32, i32* %45
%47 = icmp sgt i32 %46, 0
br i1 %47, label %48, label %55
48: ; preds = %42
%49 = load i32, i32* %10
%50 = load i32, i32* %10
%51 = sext i32 %50 to i64
%52 = getelementptr inbounds [10 x i32], [10 x i32]* %8, i64 0, i64 %51
%53 = load i32, i32* %52
%54 = call i32 @printf(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.1, i64 0, i64 0), i32 %49, i32 %53)
br label %55
55: ; preds = %48, %42
br label %56
56: ; preds = %55
%57 = load i32, i32* %10
%58 = add nsw i32 %57, 1
store i32 %58, i32* %10
br label %39
59: ; preds = %39
%60 = load i32, i32* @EXIT_SUCCESS
store i32 %60, i32* %3
br label %61
61: ; preds = %59, %14
%62 = load i32, i32* %3
ret i32 %62
}

LLVM IR (-O2):
@.str = [3 x i8] c"%s\00"
@EXIT_FAILURE = global i32 0
@.str.1 = [7 x i8] c"%d:%d\0A\00"
@EXIT_SUCCESS = global i32 0
define i32 @main(i32 %0, i8** nocapture readnone %1) {
%3 = alloca [1001 x i8]
%4 = alloca [10 x i32]
%5 = getelementptr inbounds [1001 x i8], [1001 x i8]* %3, i64 0, i64 0
%6 = bitcast [1001 x i8]* %3 to i8**
%7 = call i32 @scanf(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str, i64 0, i64 0), i8** %6)
%8 = icmp eq i32 %7, 1
br i1 %8, label %11, label %9
9: ; preds = %2
%10 = load i32, i32* @EXIT_FAILURE
br label %115
11: ; preds = %2
%12 = call i32 @strlen(i8* %5)
%13 = bitcast [10 x i32]* %4 to i8*
%14 = icmp sgt i32 %12, 0
br i1 %14, label %15, label %59
15: ; preds = %11
%16 = zext i32 %12 to i64
%17 = and i64 %16, 1
%18 = icmp eq i32 %12, 1
br i1 %18, label %21, label %19
19: ; preds = %15
%20 = and i64 %16, 4294967294
br label %36
21: ; preds = %36, %15
%22 = phi i64 [ 0, %15 ], [ %54, %36 ]
%23 = icmp eq i64 %17, 0
br i1 %23, label %32, label %24
24: ; preds = %21
%25 = getelementptr inbounds [1001 x i8], [1001 x i8]* %3, i64 0, i64 %22
%26 = load i8, i8* %25
%27 = sext i8 %26 to i64
%28 = add nsw i64 %27, -48
%29 = getelementptr inbounds [10 x i32], [10 x i32]* %4, i64 0, i64 %28
%30 = load i32, i32* %29
%31 = add nsw i32 %30, 1
store i32 %31, i32* %29
br label %32
32: ; preds = %21, %24
%33 = getelementptr inbounds [10 x i32], [10 x i32]* %4, i64 0, i64 0
%34 = load i32, i32* %33
%35 = icmp sgt i32 %34, 0
br i1 %35, label %57, label %59
36: ; preds = %36, %19
%37 = phi i64 [ 0, %19 ], [ %54, %36 ]
%38 = phi i64 [ 0, %19 ], [ %55, %36 ]
%39 = getelementptr inbounds [1001 x i8], [1001 x i8]* %3, i64 0, i64 %37
%40 = load i8, i8* %39
%41 = sext i8 %40 to i64
%42 = add nsw i64 %41, -48
%43 = getelementptr inbounds [10 x i32], [10 x i32]* %4, i64 0, i64 %42
%44 = load i32, i32* %43
%45 = add nsw i32 %44, 1
store i32 %45, i32* %43
%46 = or i64 %37, 1
%47 = getelementptr inbounds [1001 x i8], [1001 x i8]* %3, i64 0, i64 %46
%48 = load i8, i8* %47
%49 = sext i8 %48 to i64
%50 = add nsw i64 %49, -48
%51 = getelementptr inbounds [10 x i32], [10 x i32]* %4, i64 0, i64 %50
%52 = load i32, i32* %51
%53 = add nsw i32 %52, 1
store i32 %53, i32* %51
%54 = add nuw nsw i64 %37, 2
%55 = add i64 %38, 2
%56 = icmp eq i64 %55, %20
br i1 %56, label %21, label %36
57: ; preds = %32
%58 = call i32 @printf(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.1, i64 0, i64 0), i32 0, i32 %34)
br label %59
59: ; preds = %11, %32, %57
%60 = getelementptr inbounds [10 x i32], [10 x i32]* %4, i64 0, i64 1
%61 = load i32, i32* %60
%62 = icmp sgt i32 %61, 0
br i1 %62, label %63, label %65
63: ; preds = %59
%64 = call i32 @printf(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.1, i64 0, i64 0), i32 1, i32 %61)
br label %65
65: ; preds = %63, %59
%66 = getelementptr inbounds [10 x i32], [10 x i32]* %4, i64 0, i64 2
%67 = load i32, i32* %66
%68 = icmp sgt i32 %67, 0
br i1 %68, label %69, label %71
69: ; preds = %65
%70 = call i32 @printf(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.1, i64 0, i64 0), i32 2, i32 %67)
br label %71
71: ; preds = %69, %65
%72 = getelementptr inbounds [10 x i32], [10 x i32]* %4, i64 0, i64 3
%73 = load i32, i32* %72
%74 = icmp sgt i32 %73, 0
br i1 %74, label %75, label %77
75: ; preds = %71
%76 = call i32 @printf(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.1, i64 0, i64 0), i32 3, i32 %73)
br label %77
77: ; preds = %75, %71
%78 = getelementptr inbounds [10 x i32], [10 x i32]* %4, i64 0, i64 4
%79 = load i32, i32* %78
%80 = icmp sgt i32 %79, 0
br i1 %80, label %81, label %83
81: ; preds = %77
%82 = call i32 @printf(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.1, i64 0, i64 0), i32 4, i32 %79)
br label %83
83: ; preds = %81, %77
%84 = getelementptr inbounds [10 x i32], [10 x i32]* %4, i64 0, i64 5
%85 = load i32, i32* %84
%86 = icmp sgt i32 %85, 0
br i1 %86, label %87, label %89
87: ; preds = %83
%88 = call i32 @printf(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.1, i64 0, i64 0), i32 5, i32 %85)
br label %89
89: ; preds = %87, %83
%90 = getelementptr inbounds [10 x i32], [10 x i32]* %4, i64 0, i64 6
%91 = load i32, i32* %90
%92 = icmp sgt i32 %91, 0
br i1 %92, label %93, label %95
93: ; preds = %89
%94 = call i32 @printf(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.1, i64 0, i64 0), i32 6, i32 %91)
br label %95
95: ; preds = %93, %89
%96 = getelementptr inbounds [10 x i32], [10 x i32]* %4, i64 0, i64 7
%97 = load i32, i32* %96
%98 = icmp sgt i32 %97, 0
br i1 %98, label %99, label %101
99: ; preds = %95
%100 = call i32 @printf(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.1, i64 0, i64 0), i32 7, i32 %97)
br label %101
101: ; preds = %99, %95
%102 = getelementptr inbounds [10 x i32], [10 x i32]* %4, i64 0, i64 8
%103 = load i32, i32* %102
%104 = icmp sgt i32 %103, 0
br i1 %104, label %105, label %107
105: ; preds = %101
%106 = call i32 @printf(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.1, i64 0, i64 0), i32 8, i32 %103)
br label %107
107: ; preds = %105, %101
%108 = getelementptr inbounds [10 x i32], [10 x i32]* %4, i64 0, i64 9
%109 = load i32, i32* %108
%110 = icmp sgt i32 %109, 0
br i1 %110, label %111, label %113
111: ; preds = %107
%112 = call i32 @printf(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.1, i64 0, i64 0), i32 9, i32 %109)
br label %113
113: ; preds = %111, %107
%114 = load i32, i32* @EXIT_SUCCESS
br label %115
115: ; preds = %113, %9
%116 = phi i32 [ %10, %9 ], [ %114, %113 ]
ret i32 %116
}