振り返りです。
Tokio Marine & Nichido Fire Insurance Programming Contest 2023(AtCoder Beginner Contest 299) - AtCoder
AtCoder is a programming contest site for anyone from beginners to experts. We hold weekly programming contests online.
import sys
from io import StringIO
input = lambda: sys.stdin.readline()[:-1]
def test(f, data):
    stdin = sys.stdin
    stdout = sys.stdout
    sys.stdin = StringIO(data["in"])
    out = StringIO()
    sys.stdout = out
    err = None
    try:
        f()
    except BaseException as e:
        err = e
    else:
        ans = out.getvalue()
        exp = data["out"]
    sys.stdin = stdin
    sys.stdout = stdout
    if err: raise err
    result = "AC" if exp == ans else "WA"
    print(f"{result}: expected: {exp}, output: {ans}")
    
def test_all(f):
    for i, data in enumerate(eval(f'test_data{f.__name__[0]}'), 1):
        print(f"case {i}")
        test(f, data)
         
やってみよう! 
A関数を完成させて「Run」ボタンをクリックしよう!
test_dataA = [
    {
        "in":"""10
.|..*...|.
""",
        "out": """in
"""
    },{
        "in":"""10
.|..|.*...
""",
        "out": """out
"""
    },{
        "in":"""3
|*|
""",
        "out": """in
"""
    },
] 
def A():
    pass
test_all(A) 
自由欄
 
 
 
 
 
コンテスト中 
正規表現殺しを意図したであろう設問ですが、細々確認する時間が惜しいのでこんな感じです。
def A():
    input()
    S = input()
    a, b = [i for i, c in enumerate(S) if c == "|"]
    c = S.index("*")
    if a < c < b: print("in")
    else: print("out") 
test_all(A) 
結果:#40832394 
振り返り 
正規表現の練習。たまに触れないと忘れちゃいますね😩 
正規表現構文もそうだし、reモジュールのsearch()とmatch()の違い とか。
def A():
    import re
    input()
    print("in" if re.search(r"\|.*\*.*\|", input()) else "out") 
test_all(A) 
結果:#41929387 
自由欄
 
 
 
 
 
略
関係ないですけど、1ヶ月以上空けて振り返って新鮮な気持ちで書いたコード が、当時のコンテスト中の提出 と全く同じで、なんだか複雑な気持ちになりました。。
(成長してないと見るべきか、この問題に必要な知識は定着していて都度引き出し可能と見るべきか🤔)
やってみよう! 
C関数を完成させて「Run」ボタンをクリックしよう!
test_dataC = [
    {
        "in":"""10
o-oooo---o
""",
        "out": """4
"""
    },{
        "in":"""1
-
""",
        "out": """-1
"""
    },{
        "in":"""30
-o-o-oooo-oo-o-ooooooo--oooo-o
""",
        "out": """7
"""
    },{
        "in":"""5
oooo-
""",
        "out": """4
"""
    },{
        "in":"""5
-----
""",
        "out": """-1
"""
    },{
        "in":"""2
-o
""",
        "out": """1
"""
    },
] 
def C():
    pass
test_all(C) 
自由欄
 
 
 
 
 
コンテスト中 
コンテスト中の提出がこんな感じ。
連続したoの最大値を求める 
回答
-が含まれない(=ans: -1):-1 
oが含まれない(=ans: 0):-1 
上記以外:ans 
 
 
 
ここらへんの考え方をキレイに実装に落とし込めず、WA x 2となりました・・・(⬇のACコードも場当たり的に修正して分かりづらい😇)
def C():
    N = int(input())
    S = input()
    ans = -1
    now = 0
    for c in S:
        if c == "o":
            now += 1
        else:
            ans = max(ans, now)
            now = 0
    if ans != -1:
        ans = max(ans, now)
    print(ans if ans != 0 else -1) 
test_all(C) 
結果:#41999202 
自由欄
 
 
 
 
 
振り返り:reモジュールを使う 
A問題の振り返りでreモジュールを使ったのでここでも使ってみます。 
⇛re.findall(pattern, string, flags=0)
考え方は同じで、
連続するoの個数の最大値が1以上かつ-を含む:連続するoの個数の最大値 
上記以外:-1 
 
まぁまぁスッキリ書けました。 
が、実は記憶ゼロで振り返ってやってみた時も大分ハマりました・・・。2ヶ月弱サボるとこの体たらく。。精進します!
def C():
    import re
 
    N = int(input())
    S = input()
 
    max_len = max(len(m) for m in [""] + re.findall("o+", S))
    if max_len > 0 and "-" in S:
        print(max_len)
    else:
        print(-1) 
test_all(C) 
結果:#42114972 
自由欄
 
 
 
 
 
解説を見る 
解説 を見ます。 
あ、split・・・。その手があったか😭
あと「特定の文字を含む」はsetで一発判定できますね。
def C():
    input()
    S = input()
    print(max(map(len, S.split("-"))) if set('o-') == set(S) else "-1") 
test_all(C) 
結果:#42115796 
自由欄
 
 
 
 
 
略
結論から言うと二分探索なのですが、コンテスト中は「同じ文字が連続してない!にぶたん使えない!分からん寝る!」とあっさり諦めてしまいました。 
そこでもうちょい粘って「二分探索に当てはめてみるとどうなるか」を考えてみれば、同じ文字が連続してなくとも適用できることに気づけたはず。
やるからには心身ともに万全のコンディションで臨むべきなのですが、最近は忙しさにかまけてセルフマネジメントができておらず、奇しくもAtcoderでそれば顕在化されてしまいました。 
まずは生活リズムを整えるということと、ルーティンの有用性(毎週土曜のAtcoderの結果、というよりいかにして問題を解けたかor解けなかったかでコンディションが分かる)を再認識です。
と言いつつ、直近ではそのルーティンすらこなせてないのが問題です・・・
自由欄