CodeForce_KthBeautifulString


最初のプール:タイムアウト


  • bが加えられるidxの組合せを求める.
    idxは昇順にソートされます.

  • tmp=['a']*(n+1).
    bが加えた組み合わせによって、「b」を加えた後
    ツールバーの
  • ex [0,1] ... >> bbaaa(最初に作成)
    しかし、重要なのは、実際のbソートの順序が
    bのidxが[0,1]の場合、最後に来るはずです.
    したがって、作成された文字列について
    昇順に並べる.
  • 入力、シーケンス情報
    数値文字列出力
  • <タイムアウト>
    import sys
    sys.stdin = open("input.txt", "rt")
    from collections import deque, Counter
    sys.setrecursionlimit(100000)
    
    def dfs(L, val, res, ch, IdxArr):
    
        if L == 2 :
            IdxArr.append([res[0],res[1]])
            return
        else:
            for i in range( val ,  len(ch) - 1):
                if ch[i] == 0 :
                    # 방문 처리
                    ch[i] = 1
                    res.append(i)
                    dfs( L + 1, i , res , ch, IdxArr )
                    res.pop()
                    ch[i] = 0
              
    def makeCases(n) :
        ch = [0] * ( n + 1 )
        IdxArr = []
        resArr = []
    
        dfs( 0, 0 ,[], ch ,IdxArr )
    
        for idx in IdxArr:
            tmp = ['a'] * n
            tmp[ idx[0] ] = 'b'
            tmp[ idx[1] ] = 'b'
            resArr.append(tmp)
    
        resArr.sort()
        return resArr
    
    k = int(input())
    
    for _ in range(k):
        n , order = map(int, sys.stdin.readline().split())
        madeCase = makeCases(n)
        print(''.join( madeCase[order-1] ))
    

    第二:タイムアウト


    同じ原理ですが、
    組合せによるidxの順序が異なる
    一つ目は.
    [0,1] .... こんな風に作られているのですが、
    こちらです.
    [5,4] ... このようにして作ります.
    このような試みをした理由は
    最初に文字列候補を作成します.
    sortに必要な最小時間複雑度
    O(n log n)なので
    私も節約したいです.
    import sys
    sys.stdin = open("input.txt", "rt")
    from collections import deque, Counter
    sys.setrecursionlimit(100000)
    
    def dfs(L, val, res, ch, IdxArr):
    
        if L == 2 :
            IdxArr.append([res[0],res[1]])
            return
        else:
            for i in range( len(ch) - 2 , val -1 , -1 ):
                if ch[i] == 0 :
                    # 방문 처리
                    ch[i] = 1
                    res.append(i)
                    dfs( L + 1, i , res , ch, IdxArr )
                    res.pop()
                    ch[i] = 0
              
    def makeCases(n) :
        ch = [0] * ( n + 1 )
        IdxArr = []
        resArr = []
    
        dfs( 0, 0 ,[], ch ,IdxArr )
    
        for idx in IdxArr:
            tmp = ['a'] * n
            tmp[ idx[0] ] = 'b'
            tmp[ idx[1] ] = 'b'
            resArr.append(tmp)
    
        
        return resArr
    
    k = int(input())
    
    for _ in range(k):
        n , order = map(int, sys.stdin.readline().split())
        madeCase = makeCases(n)
        print(''.join

    3つ目:


    '''

    https://www.youtube.com/watch?v=bZQDRArWYeI


    理解しがたい.
    まず、2つのb
    まずidxを探す過程です
    では、2つのbを含むidxをどのように検索しますか?
    まず、左のbが来る様子を見て
    aaabb
    aabab
    aabba
    abaab
    ababa
    abbaa
    baaab
    baaba
    babaa
    bbaaa
    左のbの位置を見て
    strの長さがnであれば
    1個n-2
    n-3のうち2つ
    n-4上3個
    このように進むことが確認できます.
    つまり.
    for( let i = n -2 ; i >=0 ; i--)
    では
    n-1-i番目の左b
    私は犬です.
    では、私たちがしなければならないのは.
    入力されたk
    特定のidxについて、可能な左側bは
    これはセットです
    例えば、kが5であれば
    1個n-2
    n-3のうち2つが経過する.
    n−4は3つあり,この場合は3つの1つに属する.
    このように、kが加入するスーツに到達すると、
    そのidxに左のbを入れる
    さあ.今左に探しました.
    右へ探して
    k=5なら
    ababaです.
    n−4回目にbが現れると個数となる.
    n-2番目の1つ
    n-3番斎には2つが過ぎたかもしれません.
    kをずっと減らしているからです.
    k=2の状態.
    でも右のbの位置を見ると
    ababa
    すなわちstr長はn〜−2のidx上に位置する
    すなわち、左のbを見つけた後、
    (N−2)2番目の位置
    アルファベットが存在する意味があります!
    すなわち、左側bが置かれた後
    N-Kの2番目のidxに右側のbを置けばいいです
    '''
    
    import sys
    sys.stdin = open("input.txt", "rt")
    from collections import deque, Counter
    sys.setrecursionlimit(100000)
    
    n = int(input())
    
    for _ in range(n):
        
        N, K = map(int, sys.stdin.readline().split())
        ch = ['a'] * N
        
        for i in range(N-2,-1,-1) :
            
            numOfLeftInIPos = N - 1 - i
    
            if K <= numOfLeftInIPos :
                # 현재 여기서 이제 오른쪽 찾기
                # 우선 왼쪽 대입
                ch[i] = 'b'
    
                # 오른쪽 대입 : 오른쪽 idx = n ( str length ) - k
                ch[ N - K ] = 'b'
                print(''.join(ch))
                break
    
            K -= numOfLeftInIPos