AGC049B-Flip Digits 해설 [ptyhon]

URL


https://atcoder.jp/contests/agc049/tasks/agc049_b

문제 개요

  • 0, 1로 구성된 길이 N의 문자열 S, T를 표시합니다.
  • Si=1이 되는 임의의 i(i>=1)를 선택하여 S[i], S[i-1]의bit를 반전시키는 조작이 좋아하는 횟수
  • S와 T를 일치시킬 수 있으며, 가능하면 이를 위해 필요한 최소 조작 횟수
  • 를 구한다.

    구속


    1 <= N <= 5*10-{5}

    코드 커밋


    from collections import deque
    
    n = int(input())
    s = input()
    t = input()
    q = deque()
    ans = 0
    for i in range(n):
        if s[i] != t[i]:
            if q:  # q が空でない
                # print(i)
                if s[i] == "1":
                    ans += i - q.popleft()
                else:
                    q.append(i)
            else:
                q.append(i)
    if q:
        print(-1)
    else:
        print(ans)
    
    

    고찰하다.

  • 우선 S[i]=1이 아니면 이런 제약을 반전시킬 수 없다는 것 이외에 고려
  • 조작의 성질을 고려하면 같은 위치에서 두 번 반전하는 것은 무의미하다.
  • 같은 곳에 대해 최대 한 번만 조작하기 때문에 S에서 연속적으로 반전 조작을 하는 곳을 하나의 구간으로 설정한다.
  • 조작의 끝 얼굴, 한 구간이 원래의 배열에서 양쪽 문자만 반전하는 것을 알 수 있다.(다른 문자열은 두 번 반전되어 원래의 상태로 돌아갑니다)
  • S[i]=1의 제약을 받아 고려
  • 한 구간에 대해 오른쪽 끝을 제외한 S[i]가 조작하는 동안 두 번의 반전
  • 반전의 순서는 구간에 대한 전체 작업이 끝난 문자열과 무관하기 때문에 구간의 오른쪽 끝 이외의 구역에서 작업의 순서를 선택하여 반전할 때 S[i] = 1로 바꿀 수 있다.
  • 구간의 오른쪽을 1 이외로 제한할 수 없기 때문에 필요에 따라 끼워 넣는 중 양쪽이 일치하지 않는 구간을 형성하여 구간의 오른쪽을 1로 한다.
  • 실시 방침

  • 왼쪽부터 차례대로 S를 핥는다.
  • queue에 S[i], T[i]와 다른 위치의 index
  • 를 첨가
  • 현재queue가 비어 있지 않은 상태에서 일치하지 않는 S[i]=1의queue에서 하나를 꺼내 i와 차별을 줍니다.S[i]=0이면 구간을 형성할 수 없으므로 i를queue
  • 에 넣습니다.

    다음의 반성

  • 문자열 비교에서ifs[i]=1;
    나는 구린내 나는 벌레를 낳았다...성장하지 못하다.
  • WA 이후 일주일 정도 재운 뒤 AC를 진행했습니다.
  • 일치하지 않는 부분만 주목하고 구간 내에서 고려하면 된다는 것을 알아차린 후 오른쪽이 1인 조건을 탐욕적으로 어떻게 처리해야 할지 모른다
  • 오른쪽의 1이 될 수 있으면 탐욕스럽게 처리할 수 있기 때문에 왼쪽의 부분을queue에 넣어서 해결할 수 있다
  • 참고 자료


    https://docs.python.org/ja/3/library/collections.html?highlight=deque true
    python 문서 deque
  • deque는 O(1)에서 팝, 응용 프로그램 처리를 실행할 수 있습니다.
  • 길이가 제한된 deque.dequq(f,n)에 추가된 부분만 버려라.
  • 좋은 웹페이지 즐겨찾기