CodeForce_KthBeautifulString
最初のプール:タイムアウト
bが加えられるidxの組合せを求める.
idxは昇順にソートされます.
tmp=['a']*(n+1).
bが加えた組み合わせによって、「b」を加えた後
ツールバーの
しかし、重要なのは、実際の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
Reference
この問題について(CodeForce_KthBeautifulString), 我々は、より多くの情報をここで見つけました
https://velog.io/@dhsys112/CodeForceKthBeautifulString
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
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
'''
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
Reference
この問題について(CodeForce_KthBeautifulString), 我々は、より多くの情報をここで見つけました
https://velog.io/@dhsys112/CodeForceKthBeautifulString
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
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
Reference
この問題について(CodeForce_KthBeautifulString), 我々は、より多くの情報をここで見つけました https://velog.io/@dhsys112/CodeForceKthBeautifulStringテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol