program main
  implicit none
  integer(8) :: n, i, j, kng, cr(0:4000), cb(0:4000), cg(0:4000)
  integer(8) :: res
  character(4000) :: s
  character(2) :: sij
  character(1) :: cng

  read *, n
  read *, s
  cr = 0
  cb = 0
  cg = 0
  do i = 1, n
    cr(i) = cr(i - 1)
    cb(i) = cb(i - 1)
    cg(i) = cg(i - 1)
    if (s(i:i) == "R") then
      cr(i) = cr(i) + 1
    else if (s(i:i) == "G") then
      cg(i) = cg(i) + 1
    else
      cb(i) = cb(i) + 1
    end if
  end do
  res = 0
  do i = 1, n - 2
    do j = i + 1, n - 1
      if (s(i:i) == s(j:j)) cycle
      sij = s(i:i) // s(j:j)
      kng = j + j - i
      if (sij == "RG" .or. sij == "GR") then
        res = res + cb(n) - cb(j)
        cng = "B"
      else if (sij == "RB" .or. sij == "BR") then
        res = res + cg(n) - cg(j)
        cng = "G"
      else
        res = res + cr(n) - cr(j)
        cng = "R"
      end if
      if (kng <= n) then
        if (s(kng:kng) == cng) res = res - 1
      end if
    end do
  end do
  print "(i0)", res
end program main

; ModuleID = 'FIRModule'
source_filename = "FIRModule"
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-pc-linux-gnu"

@_QFEcb = internal unnamed_addr global [4001 x i64] undef
@_QFEcg = internal unnamed_addr global [4001 x i64] undef
@_QFEcr = internal unnamed_addr global [4001 x i64] undef
@_QFEs = internal global [4000 x i8] undef
@_QQcl.5cfdf36dd52525040b6d720b9503b805 = linkonce constant [73 x i8] c"/home/ubuntu/Downloads/TheStack_IR/Collated/Fortran/Source_1822/source.f\00"
@_QQcl.52 = linkonce constant [1 x i8] c"R"
@_QQcl.47 = linkonce constant [1 x i8] c"G"
@_QQcl.5247 = linkonce constant [2 x i8] c"RG"
@_QQcl.4752 = linkonce constant [2 x i8] c"GR"
@_QQcl.42 = linkonce local_unnamed_addr constant [1 x i8] c"B"
@_QQcl.5242 = linkonce constant [2 x i8] c"RB"
@_QQcl.4252 = linkonce constant [2 x i8] c"BR"
@_QQcl.28693029 = linkonce constant [4 x i8] c"(i0)"
@_QQEnvironmentDefaults = local_unnamed_addr constant ptr null

define void @_QQmain() local_unnamed_addr {
.preheader49.preheader:
  %0 = alloca [1 x i8], align 1
  %1 = alloca i64, align 8
  %2 = alloca [2 x i8], align 2
  %3 = tail call ptr @_FortranAioBeginExternalListInput(i32 -1, ptr nonnull @_QQcl.5cfdf36dd52525040b6d720b9503b805, i32 9)
  %4 = call i1 @_FortranAioInputInteger(ptr %3, ptr nonnull %1, i32 8)
  %5 = call i32 @_FortranAioEndIoStatement(ptr %3)
  %6 = call ptr @_FortranAioBeginExternalListInput(i32 -1, ptr nonnull @_QQcl.5cfdf36dd52525040b6d720b9503b805, i32 10)
  %7 = call i1 @_FortranAioInputAscii(ptr %6, ptr nonnull @_QFEs, i64 4000)
  %8 = call i32 @_FortranAioEndIoStatement(ptr %6)
  call void @llvm.memset.p0.i64(ptr noundef nonnull align 16 dereferenceable(32008) @_QFEcr, i8 0, i64 32008, i1 false), !tbaa !3
  call void @llvm.memset.p0.i64(ptr noundef nonnull align 16 dereferenceable(32008) @_QFEcb, i8 0, i64 32008, i1 false), !tbaa !3
  call void @llvm.memset.p0.i64(ptr noundef nonnull align 16 dereferenceable(32008) @_QFEcg, i8 0, i64 32008, i1 false), !tbaa !3
  %9 = load i64, ptr %1, align 8, !tbaa !3
  %10 = icmp sgt i64 %9, 0
  br i1 %10, label %.lr.ph, label %._crit_edge

.lr.ph:                                           ; preds = %.preheader49.preheader, %28
  %11 = phi i64 [ %31, %28 ], [ 1, %.preheader49.preheader ]
  %12 = add nsw i64 %11, -1
  %13 = getelementptr [4001 x i64], ptr @_QFEcr, i64 0, i64 %12
  %14 = load i64, ptr %13, align 8, !tbaa !3
  %15 = getelementptr [4001 x i64], ptr @_QFEcr, i64 0, i64 %11
  store i64 %14, ptr %15, align 8, !tbaa !3
  %16 = getelementptr [4001 x i64], ptr @_QFEcb, i64 0, i64 %12
  %17 = load i64, ptr %16, align 8, !tbaa !3
  %18 = getelementptr [4001 x i64], ptr @_QFEcb, i64 0, i64 %11
  store i64 %17, ptr %18, align 8, !tbaa !3
  %19 = getelementptr [4001 x i64], ptr @_QFEcg, i64 0, i64 %12
  %20 = load i64, ptr %19, align 8, !tbaa !3
  %21 = getelementptr [4001 x i64], ptr @_QFEcg, i64 0, i64 %11
  store i64 %20, ptr %21, align 8, !tbaa !3
  %22 = getelementptr [4000 x [1 x i8]], ptr @_QFEs, i64 0, i64 %12
  %23 = call i32 @_FortranACharacterCompareScalar1(ptr %22, ptr nonnull @_QQcl.52, i64 1, i64 1)
  %24 = icmp eq i32 %23, 0
  br i1 %24, label %28, label %25

25:                                               ; preds = %.lr.ph
  %26 = call i32 @_FortranACharacterCompareScalar1(ptr %22, ptr nonnull @_QQcl.47, i64 1, i64 1)
  %27 = icmp eq i32 %26, 0
  %. = select i1 %27, ptr %21, ptr %18
  br label %28

28:                                               ; preds = %25, %.lr.ph
  %.sink = phi ptr [ %15, %.lr.ph ], [ %., %25 ]
  %29 = load i64, ptr %.sink, align 8, !tbaa !3
  %30 = add i64 %29, 1
  store i64 %30, ptr %.sink, align 8, !tbaa !3
  %31 = add nuw i64 %11, 1
  %exitcond.not = icmp eq i64 %11, %9
  br i1 %exitcond.not, label %._crit_edge.loopexit, label %.lr.ph

._crit_edge.loopexit:                             ; preds = %28
  %.pre = load i64, ptr %1, align 8, !tbaa !3
  br label %._crit_edge

._crit_edge:                                      ; preds = %._crit_edge.loopexit, %.preheader49.preheader
  %32 = phi i64 [ %.pre, %._crit_edge.loopexit ], [ %9, %.preheader49.preheader ]
  %33 = add i64 %32, -2
  %34 = icmp sgt i64 %33, 0
  br i1 %34, label %.lr.ph56, label %._crit_edge57

.lr.ph56:                                         ; preds = %._crit_edge
  %.unpack = load i8, ptr @_QQcl.52, align 1
  %.unpack43 = load i8, ptr @_QQcl.47, align 1
  %.unpack44 = load i8, ptr @_QQcl.42, align 1
  %35 = add i64 %32, -2
  br label %36

36:                                               ; preds = %.lr.ph56, %._crit_edge53
  %37 = phi i64 [ 1, %.lr.ph56 ], [ %38, %._crit_edge53 ]
  %.054 = phi i64 [ 0, %.lr.ph56 ], [ %.1.lcssa, %._crit_edge53 ]
  %38 = add nuw i64 %37, 1
  %39 = load i64, ptr %1, align 8, !tbaa !3
  %40 = xor i64 %37, -1
  %41 = add i64 %39, %40
  %42 = icmp sgt i64 %41, 0
  br i1 %42, label %.lr.ph52, label %._crit_edge53

.lr.ph52:                                         ; preds = %36
  %43 = add i64 %37, -1
  %44 = getelementptr [4000 x [1 x i8]], ptr @_QFEs, i64 0, i64 %43
  br label %45

45:                                               ; preds = %.lr.ph52, %100
  %46 = phi i64 [ %41, %.lr.ph52 ], [ %102, %100 ]
  %47 = phi i64 [ %38, %.lr.ph52 ], [ %101, %100 ]
  %.150 = phi i64 [ %.054, %.lr.ph52 ], [ %.3, %100 ]
  %48 = add i64 %47, -1
  %49 = getelementptr [4000 x [1 x i8]], ptr @_QFEs, i64 0, i64 %48
  %50 = call i32 @_FortranACharacterCompareScalar1(ptr %44, ptr %49, i64 1, i64 1)
  %.not = icmp eq i32 %50, 0
  br i1 %.not, label %100, label %51

51:                                               ; preds = %45
  %52 = alloca [2 x i8], align 2
  %53 = load i8, ptr %44, align 1
  store i8 %53, ptr %52, align 2
  %.unpack45 = load i8, ptr %49, align 1, !tbaa !3
  %54 = getelementptr inbounds [1 x i8], ptr %52, i64 1
  store i8 %.unpack45, ptr %54, align 1, !tbaa !3
  %55 = load i16, ptr %52, align 2
  store i16 %55, ptr %2, align 2
  %56 = shl i64 %47, 1
  %57 = sub i64 %56, %37
  %58 = call i32 @_FortranACharacterCompareScalar1(ptr nonnull %2, ptr nonnull @_QQcl.5247, i64 2, i64 2)
  %59 = icmp eq i32 %58, 0
  %60 = call i32 @_FortranACharacterCompareScalar1(ptr nonnull %2, ptr nonnull @_QQcl.4752, i64 2, i64 2)
  %61 = icmp eq i32 %60, 0
  %62 = or i1 %59, %61
  br i1 %62, label %63, label %71

63:                                               ; preds = %51
  %64 = load i64, ptr %1, align 8, !tbaa !3
  %65 = getelementptr [4001 x i64], ptr @_QFEcb, i64 0, i64 %64
  %66 = load i64, ptr %65, align 8, !tbaa !3
  %67 = add i64 %66, %.150
  %68 = getelementptr [4001 x i64], ptr @_QFEcb, i64 0, i64 %47
  %69 = load i64, ptr %68, align 8, !tbaa !3
  %70 = sub i64 %67, %69
  store i8 %.unpack44, ptr %0, align 1, !tbaa !3
  br label %92

71:                                               ; preds = %51
  %72 = call i32 @_FortranACharacterCompareScalar1(ptr nonnull %2, ptr nonnull @_QQcl.5242, i64 2, i64 2)
  %73 = icmp eq i32 %72, 0
  %74 = call i32 @_FortranACharacterCompareScalar1(ptr nonnull %2, ptr nonnull @_QQcl.4252, i64 2, i64 2)
  %75 = icmp eq i32 %74, 0
  %76 = or i1 %73, %75
  %77 = load i64, ptr %1, align 8, !tbaa !3
  br i1 %76, label %78, label %85

78:                                               ; preds = %71
  %79 = getelementptr [4001 x i64], ptr @_QFEcg, i64 0, i64 %77
  %80 = load i64, ptr %79, align 8, !tbaa !3
  %81 = add i64 %80, %.150
  %82 = getelementptr [4001 x i64], ptr @_QFEcg, i64 0, i64 %47
  %83 = load i64, ptr %82, align 8, !tbaa !3
  %84 = sub i64 %81, %83
  store i8 %.unpack43, ptr %0, align 1, !tbaa !3
  br label %92

85:                                               ; preds = %71
  %86 = getelementptr [4001 x i64], ptr @_QFEcr, i64 0, i64 %77
  %87 = load i64, ptr %86, align 8, !tbaa !3
  %88 = add i64 %87, %.150
  %89 = getelementptr [4001 x i64], ptr @_QFEcr, i64 0, i64 %47
  %90 = load i64, ptr %89, align 8, !tbaa !3
  %91 = sub i64 %88, %90
  store i8 %.unpack, ptr %0, align 1, !tbaa !3
  br label %92

92:                                               ; preds = %63, %78, %85
  %93 = phi i64 [ %64, %63 ], [ %77, %78 ], [ %77, %85 ]
  %.2 = phi i64 [ %70, %63 ], [ %84, %78 ], [ %91, %85 ]
  %.not42 = icmp sgt i64 %57, %93
  br i1 %.not42, label %100, label %94

94:                                               ; preds = %92
  %95 = add i64 %57, -1
  %96 = getelementptr [4000 x [1 x i8]], ptr @_QFEs, i64 0, i64 %95
  %97 = call i32 @_FortranACharacterCompareScalar1(ptr %96, ptr nonnull %0, i64 1, i64 1)
  %98 = icmp eq i32 %97, 0
  %99 = sext i1 %98 to i64
  %spec.select = add i64 %.2, %99
  br label %100

100:                                              ; preds = %94, %92, %45
  %.3 = phi i64 [ %.2, %92 ], [ %.150, %45 ], [ %spec.select, %94 ]
  %101 = add i64 %47, 1
  %102 = add i64 %46, -1
  %103 = icmp sgt i64 %102, 0
  br i1 %103, label %45, label %._crit_edge53

._crit_edge53:                                    ; preds = %100, %36
  %.1.lcssa = phi i64 [ %.054, %36 ], [ %.3, %100 ]
  %exitcond59.not = icmp eq i64 %37, %35
  br i1 %exitcond59.not, label %._crit_edge57, label %36

._crit_edge57:                                    ; preds = %._crit_edge53, %._crit_edge
  %.0.lcssa = phi i64 [ 0, %._crit_edge ], [ %.1.lcssa, %._crit_edge53 ]
  %104 = call ptr @_FortranAioBeginExternalFormattedOutput(ptr nonnull @_QQcl.28693029, i64 4, ptr null, i32 -1, ptr nonnull @_QQcl.5cfdf36dd52525040b6d720b9503b805, i32 47)
  %105 = call i1 @_FortranAioOutputInteger64(ptr %104, i64 %.0.lcssa)
  %106 = call i32 @_FortranAioEndIoStatement(ptr %104)
  ret void
}

declare ptr @_FortranAioBeginExternalListInput(i32, ptr, i32) local_unnamed_addr

declare i1 @_FortranAioInputInteger(ptr, ptr, i32) local_unnamed_addr

declare i32 @_FortranAioEndIoStatement(ptr) local_unnamed_addr

declare i1 @_FortranAioInputAscii(ptr, ptr, i64) local_unnamed_addr

declare i32 @_FortranACharacterCompareScalar1(ptr, ptr, i64, i64) local_unnamed_addr

declare ptr @_FortranAioBeginExternalFormattedOutput(ptr, i64, ptr, i32, ptr, i32) local_unnamed_addr

declare i1 @_FortranAioOutputInteger64(ptr, i64) local_unnamed_addr

; Function Attrs: nocallback nofree nounwind willreturn memory(argmem: write)
declare void @llvm.memset.p0.i64(ptr nocapture writeonly, i8, i64, i1 immarg) #0

attributes #0 = { nocallback nofree nounwind willreturn memory(argmem: write) }

!llvm.module.flags = !{!0, !1, !2}

!0 = !{i32 2, !"Debug Info Version", i32 3}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{!4, !4, i64 0}
!4 = !{!"any data access", !5, i64 0}
!5 = !{!"any access", !6, i64 0}
!6 = !{!"Flang Type TBAA Root"}
