ABC 299 備忘録

## 概要
　今回はABC299（2023年4月22日21:00~22:40）のポイントと自分の実装について書いていこうと思う。

## A問題
https://atcoder.jp/contests/abc299/tasks/abc299_a

### ポイント

- `|` に囲まれているかどうかを `bool` で判断させる
- １つ目の `|` が出た時点で `False -> True` とする

### 自分の実装

```Python:ABC_299_A.py
N = int(input())

S = list(input())

between_judge = False

for letter in S:
    if letter == '|' and between_judge == False:
        between_judge = True
    elif letter == '*' and between_judge == True:
        print('in')
        exit()
    elif letter == '|' and between_judge == True:
        between_judge = False
        print('out')
        exit()
```

## B問題
https://atcoder.jp/contests/abc299/tasks/abc299_b

### ポイント

- 指定の色と1番目のプレイヤーが出した色のカード両方について、全探索
- 初期値の `0` か否かで問題文のどの条件の処理を実行するかを判断

### 自分の実装

```Python:ABC_299_B.py
from collections import deque

N, T = map(int, input().split())

colors = deque(list(map(int, input().split())))
numbers = deque(list(map(int, input().split())))

max_number = 0

winner = 0

max_alternative_number = 0

alternative_winner = 0

alternative_color = 0

for i in range(N):
    ith_color = colors.popleft()
    ith_number = numbers.popleft()
    if ith_color == T and max(max_number, ith_number) == ith_number:
        winner = i+1
        max_number = ith_number
    if i == 0:
        max_alternative_number = ith_number
        alternative_winner = 1
        alternative_color = ith_color
    if ith_color == alternative_color and max(max_alternative_number, ith_number) == ith_number:
        max_alternative_number = ith_number
        alternative_winner = i+1

if winner != 0:
    print(winner)
    exit()
else:
    print(alternative_winner)
    exit()
```

## C問題
https://atcoder.jp/contests/abc299/tasks/abc299_c

### ポイント

- 愚直に文字を考えていくと `TLE` となってしまうので、連長圧縮を用いて `o, -` が何個連続しているかどうかをカウント
-  レベル `L` は `o` の連続している数なので、作成した配列長さが2以上ならば `-` が１つ以上存在し、長さを測ることが可能

### 自分の実装

```Python:ABC_299_C.py
from collections import deque

N = int(input())

S = deque(list(input()))

ans = -1

judge_letters = deque()
last_letter = ''
count_same_continual_letter = 1

for i in range(N): 
    if i == 0:
        last_letter = S.popleft()
    elif i != N-1:
        present_letter = S.popleft()
        if present_letter == last_letter:
            count_same_continual_letter += 1
        else:
            judge_letters.append([last_letter, count_same_continual_letter])
            count_same_continual_letter = 1
            last_letter = present_letter
    else:
        present_letter = S.popleft()
        if present_letter == last_letter:
            count_same_continual_letter += 1
            judge_letters.append([last_letter, count_same_continual_letter])
        else:
            judge_letters.append([last_letter, count_same_continual_letter])
            judge_letters.append([present_letter, 1])
            
length_judge_letters = len(judge_letters)

last_letters = []
present_letters = []

for i in range(length_judge_letters):
    if i == 0:
        last_letters = judge_letters.popleft()
    else:
        present_letters = judge_letters.popleft()
        if last_letters[0] == '-':
            ans = max(ans, present_letters[1])
        else:
            ans = max(ans, last_letters[1])
        last_letters = present_letters

print(ans)
```

##  感想
　今回はコンテスト始めから `Dos` 攻撃によるサーバーダウンが起こっており、なかなか提出できなかった。問題自体に関しては、C問題の条件分岐で何度かミスってしまった。