#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 /*<<< orphan*/ printf(char *);
int /*<<< orphan*/ scanf(char *, char *);
int strlen(char *);
int main() {
  char s[100];
  int i, a[27], count = 0;
  for (i = 0; i < 27; i++)
    a[i] = 0;
  scanf("%s", s);
  for (i = 0; i < strlen(s); i++)
    a[s[i] - 97] = 1;
  for (i = 0; i < 27; i++) {
    if (a[i] == 1)
      count++;
  }
  if (count % 2 == 0)
    printf("CHAT WITH HER!\n");
  else
    printf("IGNORE HIM!\n");
  return 0;
}


x86 assembly (clang, -O0):
<main>:
push   %rbp
mov    %rsp,%rbp
sub    $0xf0,%rsp
movl   $0x0,-0x4(%rbp)
movl   $0x0,-0xe4(%rbp)
movl   $0x0,-0x74(%rbp)
cmpl   $0x1b,-0x74(%rbp)
jge    117a <main+0x4a>
movslq -0x74(%rbp),%rax
movl   $0x0,-0xe0(%rbp,%rax,4)
mov    -0x74(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x74(%rbp)
jmp    1153 <main+0x23>
lea    -0x70(%rbp),%rsi
lea    0xe7b(%rip),%rdi
call   1050 <scanf@plt>
movl   $0x0,-0x74(%rbp)
mov    -0x74(%rbp),%eax
mov    %eax,-0xe8(%rbp)
lea    -0x70(%rbp),%rdi
call   1030 <strlen@plt>
mov    %eax,%ecx
mov    -0xe8(%rbp),%eax
cmp    %ecx,%eax
jge    11da <main+0xaa>
movslq -0x74(%rbp),%rax
movsbl -0x70(%rbp,%rax,1),%eax
sub    $0x61,%eax
cltq
movl   $0x1,-0xe0(%rbp,%rax,4)
mov    -0x74(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x74(%rbp)
jmp    1191 <main+0x61>
movl   $0x0,-0x74(%rbp)
cmpl   $0x1b,-0x74(%rbp)
jge    121f <main+0xef>
movslq -0x74(%rbp),%rax
cmpl   $0x1,-0xe0(%rbp,%rax,4)
01
jne    120c <main+0xdc>
mov    -0xe4(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0xe4(%rbp)
jmp    1211 <main+0xe1>
mov    -0x74(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x74(%rbp)
jmp    11e1 <main+0xb1>
mov    -0xe4(%rbp),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
cmp    $0x0,%edx
jne    1247 <main+0x117>
lea    0xdc6(%rip),%rdi
call   1040 <printf@plt>
jmp    1253 <main+0x123>
lea    0xdc5(%rip),%rdi
call   1040 <printf@plt>
xor    %eax,%eax
add    $0xf0,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<main>:
push   %r14
push   %rbx
sub    $0xd8,%rsp
xorps  %xmm0,%xmm0
movups %xmm0,0x5c(%rsp)
movaps %xmm0,0x50(%rsp)
movaps %xmm0,0x40(%rsp)
movaps %xmm0,0x30(%rsp)
movaps %xmm0,0x20(%rsp)
movaps %xmm0,0x10(%rsp)
movaps %xmm0,(%rsp)
lea    0xeaa(%rip),%rdi
lea    0x70(%rsp),%rbx
mov    %rbx,%rsi
call   1050 <scanf@plt>
mov    %rbx,%rdi
call   1040 <strlen@plt>
test   %eax,%eax
jle    11b4 <main+0x84>
xor    %ebx,%ebx
lea    0x70(%rsp),%r14
cs nopw 0x0(%rax,%rax,1)
movsbq 0x70(%rsp,%rbx,1),%rax
movl   $0x1,-0x184(%rsp,%rax,4)
add    $0x1,%rbx
mov    %r14,%rdi
call   1040 <strlen@plt>
cltq
cmp    %rax,%rbx
jl     1190 <main+0x60>
movdqa 0xe44(%rip),%xmm0
xor    %eax,%eax
cmpl   $0x1,0x60(%rsp)
sete   %al
xor    %ecx,%ecx
cmpl   $0x1,0x64(%rsp)
sete   %cl
xor    %edx,%edx
cmpl   $0x1,0x68(%rsp)
sete   %dl
movdqa 0x30(%rsp),%xmm1
pcmpeqd %xmm0,%xmm1
movdqa 0x20(%rsp),%xmm2
pcmpeqd %xmm0,%xmm2
packssdw %xmm1,%xmm2
movdqa 0x10(%rsp),%xmm1
pcmpeqd %xmm0,%xmm1
movdqa (%rsp),%xmm3
pcmpeqd %xmm0,%xmm3
packssdw %xmm1,%xmm3
packsswb %xmm2,%xmm3
pmovmskb %xmm3,%esi
mov    %esi,%edi
shr    %edi
and    $0x5555,%edi
sub    %edi,%esi
mov    %esi,%edi
and    $0x3333,%edi
shr    $0x2,%esi
and    $0x3333,%esi
add    %edi,%esi
mov    %esi,%edi
shr    $0x4,%edi
add    %esi,%edi
and    $0xf0f,%edi
mov    %edi,%ebx
shl    $0x8,%ebx
add    %edi,%ebx
movdqa 0x50(%rsp),%xmm1
pcmpeqd %xmm0,%xmm1
pcmpeqd 0x40(%rsp),%xmm0
movzbl %bh,%esi
packssdw %xmm1,%xmm0
packsswb %xmm0,%xmm0
pmovmskb %xmm0,%edi
mov    %edi,%ebx
shr    %bl
and    $0x55,%bl
sub    %bl,%dil
mov    %edi,%ebx
and    $0x33,%bl
shr    $0x2,%dil
and    $0x33,%dil
add    %bl,%dil
mov    %edi,%ebx
shr    $0x4,%bl
add    %dil,%bl
and    $0xf,%bl
movzbl %bl,%edi
add    %esi,%edi
add    %eax,%edi
add    %ecx,%edi
add    %edx,%edi
test   $0x1,%dil
lea    0xd81(%rip),%rax
lea    0xd6e(%rip),%rdi
cmove  %rax,%rdi
call   1030 <puts@plt>
xor    %eax,%eax
add    $0xd8,%rsp
pop    %rbx
pop    %r14
ret

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

LLVM IR (-O2):
@.str = [3 x i8] c"%s\00"
@str = [12 x i8] c"IGNORE HIM!\00"
@str.3 = [15 x i8] c"CHAT WITH HER!\00"
define i32 @main() {
%1 = alloca [100 x i8]
%2 = alloca [27 x i32]
%3 = bitcast [27 x i32]* %2 to i8*
%4 = getelementptr inbounds [100 x i8], [100 x i8]* %1, i64 0, i64 0
%5 = call i32 @scanf(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str, i64 0, i64 0), i8* %4)
%6 = call i32 @strlen(i8* %4)
%7 = icmp sgt i32 %6, 0
br i1 %7, label %42, label %8
8: ; preds = %42, %0
%9 = bitcast [27 x i32]* %2 to <16 x i32>*
%10 = load <16 x i32>, <16 x i32>* %9
%11 = icmp eq <16 x i32> %10, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
%12 = getelementptr inbounds [27 x i32], [27 x i32]* %2, i64 0, i64 16
%13 = bitcast i32* %12 to <8 x i32>*
%14 = load <8 x i32>, <8 x i32>* %13
%15 = icmp eq <8 x i32> %14, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
%16 = getelementptr inbounds [27 x i32], [27 x i32]* %2, i64 0, i64 24
%17 = load i32, i32* %16
%18 = icmp eq i32 %17, 1
%19 = zext i1 %18 to i32
%20 = getelementptr inbounds [27 x i32], [27 x i32]* %2, i64 0, i64 25
%21 = load i32, i32* %20
%22 = icmp eq i32 %21, 1
%23 = zext i1 %22 to i32
%24 = getelementptr inbounds [27 x i32], [27 x i32]* %2, i64 0, i64 26
%25 = load i32, i32* %24
%26 = icmp eq i32 %25, 1
%27 = zext i1 %26 to i32
%28 = bitcast <16 x i1> %11 to i16
%29 = call i16 @llvm.ctpop.i16(i16 %28)
%30 = zext i16 %29 to i32
%31 = bitcast <8 x i1> %15 to i8
%32 = call i8 @llvm.ctpop.i8(i8 %31)
%33 = zext i8 %32 to i32
%34 = add nuw nsw i32 %30, %33
%35 = add nuw nsw i32 %34, %19
%36 = add nuw nsw i32 %35, %23
%37 = add nuw nsw i32 %36, %27
%38 = and i32 %37, 1
%39 = icmp eq i32 %38, 0
%40 = select i1 %39, i8* getelementptr inbounds ([15 x i8], [15 x i8]* @str.3, i64 0, i64 0), i8* getelementptr inbounds ([12 x i8], [12 x i8]* @str, i64 0, i64 0)
%41 = call i32 @puts(i8* dereferenceable(1) %40)
ret i32 0
42: ; preds = %0, %42
%43 = phi i64 [ %49, %42 ], [ 0, %0 ]
%44 = getelementptr inbounds [100 x i8], [100 x i8]* %1, i64 0, i64 %43
%45 = load i8, i8* %44
%46 = sext i8 %45 to i64
%47 = add nsw i64 %46, -97
%48 = getelementptr inbounds [27 x i32], [27 x i32]* %2, i64 0, i64 %47
store i32 1, i32* %48
%49 = add nuw nsw i64 %43, 1
%50 = call i32 @strlen(i8* %4)
%51 = sext i32 %50 to i64
%52 = icmp slt i64 %49, %51
br i1 %52, label %42, label %8
}