#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 */
typedef int /*<<< orphan*/ FILE;

/* Variables and functions */
char *FLine(int /*<<< orphan*/ *);
int /*<<< orphan*/ *fopen(char *, char *);
int /*<<< orphan*/ fprintf(int /*<<< orphan*/ *, char *, int);
char *multiplyStr(char *, int, int);
int /*<<< orphan*/ printf(char *, int);
int strtoi(char *);
int main() {
  FILE *fl = fopen("beads.in", "r");
  FILE *fout = fopen("beads.out", "w");
  int strLen = strtoi(FLine(fl));
  char *strIn = FLine(fl);
  strIn = multiplyStr(strIn, strLen, 2);
  strLen *= 2;
  int maxBeads = 2;
  char reference = '0';
  char next;
  int numReferences = 0;
  int numOthers = 0;
  int i;
  for (i = 0; i < strLen; i++) {
    next = *(strIn + i);
    if ((numReferences + numOthers) >= (strLen / 2)) {
      break;
    } else if ((next == reference) && (numOthers > 0)) {
      if ((numReferences + numOthers) > maxBeads) {
        maxBeads = numReferences + numOthers;
      }
      i -= (numOthers + 1);
      while (1) {
        if (*(strIn + i) == 'w') {
          i--;
        } else {
          break;
        }
      }
      reference = '0';
      numOthers = 0;
      numReferences = 0;
    } else if (numOthers == 0) {
      if ((reference == '0') && (next != 'w')) {
        reference = next;
        numReferences++;
      } else if ((reference != '0') && (next != reference) && (next != 'w')) {
        numOthers++;
      } else {
        numReferences++;
      }
    } else {
      numOthers++;
    }
  }
  if ((numReferences + numOthers) > maxBeads) {
    maxBeads = numReferences + numOthers;
  }
  printf("Max Beads = %d\n", maxBeads);
  fprintf(fout, "%d\n", maxBeads);
}


x86 assembly (clang, -O0):
<main>:
push   %rbp
mov    %rsp,%rbp
sub    $0x40,%rsp
movl   $0x0,-0x4(%rbp)
lea    0xe8a(%rip),%rdi
lea    0xe8c(%rip),%rsi
call   1080 <fopen@plt>
mov    %rax,-0x10(%rbp)
lea    0xe7e(%rip),%rdi
lea    0xe81(%rip),%rsi
call   1080 <fopen@plt>
mov    %rax,-0x18(%rbp)
mov    -0x10(%rbp),%rdi
call   1070 <FLine@plt>
mov    %rax,%rdi
call   1040 <strtoi@plt>
mov    %eax,-0x1c(%rbp)
mov    -0x10(%rbp),%rdi
call   1070 <FLine@plt>
mov    %rax,-0x28(%rbp)
mov    -0x28(%rbp),%rdi
mov    -0x1c(%rbp),%esi
mov    $0x2,%edx
call   1060 <multiplyStr@plt>
mov    %rax,-0x28(%rbp)
mov    -0x1c(%rbp),%eax
shl    $0x1,%eax
mov    %eax,-0x1c(%rbp)
movl   $0x2,-0x2c(%rbp)
movb   $0x30,-0x2d(%rbp)
movl   $0x0,-0x34(%rbp)
movl   $0x0,-0x38(%rbp)
movl   $0x0,-0x3c(%rbp)
mov    -0x3c(%rbp),%eax
cmp    -0x1c(%rbp),%eax
jge    1369 <main+0x209>
mov    -0x28(%rbp),%rax
movslq -0x3c(%rbp),%rcx
mov    (%rax,%rcx,1),%al
mov    %al,-0x2e(%rbp)
mov    -0x34(%rbp),%eax
add    -0x38(%rbp),%eax
mov    %eax,-0x40(%rbp)
mov    -0x1c(%rbp),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %eax,%ecx
mov    -0x40(%rbp),%eax
cmp    %ecx,%eax
jl     123c <main+0xdc>
jmp    1369 <main+0x209>
movsbl -0x2e(%rbp),%eax
movsbl -0x2d(%rbp),%ecx
cmp    %ecx,%eax
jne    12c0 <main+0x160>
cmpl   $0x0,-0x38(%rbp)
jle    12c0 <main+0x160>
mov    -0x34(%rbp),%eax
add    -0x38(%rbp),%eax
cmp    -0x2c(%rbp),%eax
jle    126e <main+0x10e>
mov    -0x34(%rbp),%eax
add    -0x38(%rbp),%eax
mov    %eax,-0x2c(%rbp)
mov    -0x38(%rbp),%ecx
add    $0x1,%ecx
mov    -0x3c(%rbp),%eax
sub    %ecx,%eax
mov    %eax,-0x3c(%rbp)
mov    -0x28(%rbp),%rax
movslq -0x3c(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x77,%eax
jne    129f <main+0x13f>
mov    -0x3c(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x3c(%rbp)
jmp    12a4 <main+0x144>
jmp    12a9 <main+0x149>
jmp    127c <main+0x11c>
movb   $0x30,-0x2d(%rbp)
movl   $0x0,-0x38(%rbp)
movl   $0x0,-0x34(%rbp)
jmp    1351 <main+0x1f1>
cmpl   $0x0,-0x38(%rbp)
jne    1343 <main+0x1e3>
movsbl -0x2d(%rbp),%eax
cmp    $0x30,%eax
jne    12f8 <main+0x198>
movsbl -0x2e(%rbp),%eax
cmp    $0x77,%eax
je     12f8 <main+0x198>
mov    -0x2e(%rbp),%al
mov    %al,-0x2d(%rbp)
mov    -0x34(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x34(%rbp)
jmp    133e <main+0x1de>
movsbl -0x2d(%rbp),%eax
cmp    $0x30,%eax
je     1330 <main+0x1d0>
movsbl -0x2e(%rbp),%eax
movsbl -0x2d(%rbp),%ecx
cmp    %ecx,%eax
je     1330 <main+0x1d0>
movsbl -0x2e(%rbp),%eax
cmp    $0x77,%eax
je     1330 <main+0x1d0>
mov    -0x38(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x38(%rbp)
jmp    1339 <main+0x1d9>
mov    -0x34(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x34(%rbp)
jmp    133e <main+0x1de>
jmp    134c <main+0x1ec>
mov    -0x38(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x38(%rbp)
jmp    1351 <main+0x1f1>
jmp    1356 <main+0x1f6>
jmp    135b <main+0x1fb>
mov    -0x3c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x3c(%rbp)
jmp    11fc <main+0x9c>
mov    -0x34(%rbp),%eax
add    -0x38(%rbp),%eax
cmp    -0x2c(%rbp),%eax
jle    1381 <main+0x221>
mov    -0x34(%rbp),%eax
add    -0x38(%rbp),%eax
mov    %eax,-0x2c(%rbp)
mov    -0x2c(%rbp),%esi
lea    0xc8c(%rip),%rdi
call   1030 <printf@plt>
mov    -0x18(%rbp),%rdi
mov    -0x2c(%rbp),%edx
lea    0xc85(%rip),%rsi
call   1050 <fprintf@plt>
mov    -0x4(%rbp),%eax
add    $0x40,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<main>:
push   %rbp
push   %r15
push   %r14
push   %rbx
push   %rax
lea    0xe92(%rip),%rdi
lea    0xe94(%rip),%rsi
call   1080 <fopen@plt>
mov    %rax,%rbp
lea    0xe87(%rip),%rdi
lea    0xe8a(%rip),%rsi
call   1080 <fopen@plt>
mov    %rax,%r14
mov    %rbp,%rdi
call   1070 <FLine@plt>
mov    %rax,%rdi
call   1040 <strtoi@plt>
mov    %eax,%r15d
mov    %rbp,%rdi
call   1070 <FLine@plt>
mov    $0x2,%ebp
mov    %rax,%rdi
mov    %r15d,%esi
mov    $0x2,%edx
call   1060 <multiplyStr@plt>
test   %r15d,%r15d
jle    127c <main+0x11c>
lea    (%r15,%r15,1),%r8d
mov    $0x2,%ebp
mov    $0x30,%r9b
xor    %edx,%edx
xor    %edi,%edi
xor    %esi,%esi
jmp    11f3 <main+0x93>
test   %edi,%edi
je     123a <main+0xda>
add    $0x1,%edi
add    $0x1,%edx
cmp    %r8d,%edx
jge    1278 <main+0x118>
lea    (%rdi,%rsi,1),%ebx
cmp    %r15d,%ebx
jge    1278 <main+0x118>
movslq %edx,%rcx
mov    (%rax,%rcx,1),%cl
cmp    %r9b,%cl
jne    11e0 <main+0x80>
test   %edi,%edi
jle    11e0 <main+0x80>
mov    %edi,%ecx
not    %ecx
add    %edx,%ecx
movslq %ecx,%rcx
sub    %edi,%edx
add    %rax,%rcx
nopl   0x0(%rax,%rax,1)
add    $0xffffffff,%edx
cmpb   $0x77,(%rcx)
lea    -0x1(%rcx),%rcx
je     1220 <main+0xc0>
cmp    %ebp,%ebx
cmovg  %ebx,%ebp
xor    %esi,%esi
mov    $0x30,%r9b
xor    %edi,%edi
jmp    11e7 <main+0x87>
cmp    $0x30,%r9b
jne    124f <main+0xef>
cmp    $0x77,%cl
je     124f <main+0xef>
add    $0x1,%esi
xor    %edi,%edi
mov    %ecx,%r9d
jmp    11e7 <main+0x87>
cmp    $0x77,%cl
setne  %bl
cmp    $0x30,%r9b
setne  %dil
cmp    %r9b,%cl
setne  %cl
and    %bl,%cl
and    %dil,%cl
movzbl %cl,%edi
xor    $0x1,%cl
movzbl %cl,%ecx
add    %ecx,%esi
jmp    11e7 <main+0x87>
add    %edi,%esi
jmp    127e <main+0x11e>
xor    %esi,%esi
cmp    %ebp,%esi
cmovg  %esi,%ebp
lea    0xd8d(%rip),%rdi
mov    %ebp,%esi
call   1030 <printf@plt>
lea    0xd8b(%rip),%rsi
mov    %r14,%rdi
mov    %ebp,%edx
call   1050 <fprintf@plt>
xor    %eax,%eax
add    $0x8,%rsp
pop    %rbx
pop    %r14
pop    %r15
pop    %rbp
ret

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

LLVM IR (-O2):
@.str = [9 x i8] c"beads.in\00"
@.str.1 = [2 x i8] c"r\00"
@.str.2 = [10 x i8] c"beads.out\00"
@.str.3 = [2 x i8] c"w\00"
@.str.4 = [16 x i8] c"Max Beads = %d\0A\00"
@.str.5 = [4 x i8] c"%d\0A\00"
define i32 @main() {
%1 = tail call i32* @fopen(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str, i64 0, i64 0), i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.1, i64 0, i64 0))
%2 = tail call i32* @fopen(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.2, i64 0, i64 0), i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.3, i64 0, i64 0))
%3 = tail call i8* @FLine(i32* %1)
%4 = tail call i32 @strtoi(i8* %3)
%5 = tail call i8* @FLine(i32* %1)
%6 = tail call i8* @multiplyStr(i8* %5, i32 %4, i32 2)
%7 = shl nsw i32 %4, 1
%8 = icmp sgt i32 %4, 0
br i1 %8, label %9, label %70
9: ; preds = %0, %57
%10 = phi i32 [ %63, %57 ], [ 0, %0 ]
%11 = phi i32 [ %61, %57 ], [ 0, %0 ]
%12 = phi i32 [ %60, %57 ], [ 0, %0 ]
%13 = phi i8 [ %59, %57 ], [ 48, %0 ]
%14 = phi i32 [ %58, %57 ], [ 2, %0 ]
%15 = sext i32 %10 to i64
%16 = getelementptr inbounds i8, i8* %6, i64 %15
%17 = load i8, i8* %16
%18 = add nsw i32 %11, %12
%19 = icmp slt i32 %18, %4
br i1 %19, label %20, label %65
20: ; preds = %9
%21 = icmp eq i8 %17, %13
%22 = icmp sgt i32 %11, 0
%23 = select i1 %21, i1 %22, i1 false
br i1 %23, label %24, label %35
24: ; preds = %20
%25 = icmp sgt i32 %18, %14
%26 = xor i32 %11, -1
%27 = add i32 %10, %26
%28 = sext i32 %27 to i64
br label %29
29: ; preds = %29, %24
%30 = phi i64 [ %34, %29 ], [ %28, %24 ]
%31 = getelementptr inbounds i8, i8* %6, i64 %30
%32 = load i8, i8* %31
%33 = icmp eq i8 %32, 119
%34 = add i64 %30, -1
br i1 %33, label %29, label %54
35: ; preds = %20
%36 = icmp eq i32 %11, 0
br i1 %36, label %37, label %52
37: ; preds = %35
%38 = icmp eq i8 %13, 48
%39 = icmp ne i8 %17, 119
%40 = select i1 %38, i1 %39, i1 false
br i1 %40, label %41, label %43
41: ; preds = %37
%42 = add nsw i32 %12, 1
br label %57
43: ; preds = %37
%44 = icmp ne i8 %13, 48
%45 = icmp ne i8 %17, %13
%46 = and i1 %45, %39
%47 = select i1 %44, i1 %46, i1 false
%48 = xor i1 %47, true
%49 = zext i1 %48 to i32
%50 = add nsw i32 %12, %49
%51 = zext i1 %47 to i32
br label %57
52: ; preds = %35
%53 = add nsw i32 %11, 1
br label %57
54: ; preds = %29
%55 = select i1 %25, i32 %18, i32 %14
%56 = trunc i64 %30 to i32
br label %57
57: ; preds = %54, %43, %52, %41
%58 = phi i32 [ %14, %41 ], [ %14, %52 ], [ %14, %43 ], [ %55, %54 ]
%59 = phi i8 [ %17, %41 ], [ %13, %52 ], [ %13, %43 ], [ 48, %54 ]
%60 = phi i32 [ %42, %41 ], [ %12, %52 ], [ %50, %43 ], [ 0, %54 ]
%61 = phi i32 [ 0, %41 ], [ %53, %52 ], [ %51, %43 ], [ 0, %54 ]
%62 = phi i32 [ %10, %41 ], [ %10, %52 ], [ %10, %43 ], [ %56, %54 ]
%63 = add nsw i32 %62, 1
%64 = icmp slt i32 %63, %7
br i1 %64, label %9, label %65
65: ; preds = %9, %57
%66 = phi i32 [ %58, %57 ], [ %14, %9 ]
%67 = phi i32 [ %60, %57 ], [ %12, %9 ]
%68 = phi i32 [ %61, %57 ], [ %11, %9 ]
%69 = add nsw i32 %68, %67
br label %70
70: ; preds = %65, %0
%71 = phi i32 [ 2, %0 ], [ %66, %65 ]
%72 = phi i32 [ 0, %0 ], [ %69, %65 ]
%73 = icmp sgt i32 %72, %71
%74 = select i1 %73, i32 %72, i32 %71
%75 = tail call i32 @printf(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str.4, i64 0, i64 0), i32 %74)
%76 = tail call i32 @fprintf(i32* %2, i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.5, i64 0, i64 0), i32 %74)
ret i32 0
}