AGC034B-ABC 해설 [ptyhon]

URL


https://atcoder.jp/contests/agc034/tasks/agc034_b

구속


1<= |s| <= 2*10^{5}
s의 각 문자는 A, B, C 중 어느 것입니까

문제 개요

  • s의 연속적인 부분 열에서 ABC를 선택하고 BCA로 변경하는 작업을 최대한 많이 진행할 때 최대 작업 횟수
  • 를 구합니다

    코드 커밋


    s = input()
    l_s = len(s)
    ans = 0
    consequence_A = 0
    i = 0
    while i < l_s:
        if s[i] == "A":
            consequence_A += 1
        elif i < l_s - 1 and s[i : i + 2] == "BC":
            ans += consequence_A
            i += 1
            # print(ans, i, consequence_A)
        else:
            consequence_A = 0
        i += 1
    print(ans)
    
    
    

    고찰하다.

  • 견본을 보는 동시에 어떤 상황에서 조작할 수 있는지 고려한다
  • ABC 연속 또는 ABC의 오른쪽 A가 왼쪽 BC 연속인 경우 작동 가능
  • 다시 말하면 BC가 오른쪽에 있을 때 A를 BC의 왼쪽으로 이동시키는 동작으로 바꿀 수 있고 A의 오른쪽이 BCorA가 아닐 때 A는 이동할 수 없다.
  • 상기 조건에 따라 왼쪽에서 A를 발견하면 몇 개를 이동할 수 있고 계산한 후에 답이 나온다
  • 실시 방침

  • A를 변수로 연결
  • 다음 문자열이 BCor A가 아닌 경우 0
  • 반환
  • BC를 초과할 때마다 A를 몇 개 이어서ans에 놓는다
  • 다음의 반성


    for i in range(l_x):
      if ~~
      elif i < l_s - 1 and s[i : i + 2] == "BC":
            ans += consequence_A
            i += 1
      else: ~~
    
    에 버그가 발생했다고 쓰여 있습니다.
    C++의 느낌과 마찬가지로 for회로에 1이동전화를 넣어도 의미가 없다
    python의 for 순환은 in~에 적힌 서열형 순서대로 순환하는 동작이기 때문에 순환 중에 균형기가 바뀌어도 다음 순환에 영향을 주지 않습니다.(참조)

    참고 자료


    https://docs.python.org/ja/3/tutorial/controlflow.html?highlight=for
    파이톤의 for문과 독자들이 C 언어와 Pascal 언어에 익숙해진 for문은 조금 다를 수 있습니다.(예: Pascal) 는 항상 산술 형식의 수열에서 반복되고, (예: C) 사용자가 반복 절차와 정지 조건을 정의할 수 있도록 하는 것과 달리, 파이톤의 for문은 임의의 시퀀스 형식 (목록이나 문자열) 에서 반복됩니다.반복 순서는 시퀀스에서 요소가 나타나는 순서입니다.
    https://ami-atcoder.hatenablog.com/entry/20190605/1559712377
    BC를 D로 미리 바꾸면 더 쉬울 거예요.(확실)

    좋은 웹페이지 즐겨찾기