1

私は最近、HackerEarth の問題を解決しようとしていました。コードは、サンプル入力と、私が指定したいくつかのカスタム入力で機能しました。しかし、送信すると、制限時間を超えているためエラーが表示されました。コードをより速く実行する方法を誰かが説明できますか?

問題文: 巡回シフト

大きな 2 進数は、サイズ N の文字列 A で表され、0 と 1 で構成されます。この文字列に対して巡回シフトを実行する必要があります。巡回シフト操作は次のように定義されます。

文字列 A が [A0, A1,..., An-1] の場合、巡回シフトを 1 回実行すると、文字列は [A1, A2,..., An-1, A0] になります。

シフトを無限回実行し、そのたびに文字列で表される 2 進数の値を記録しました。演算を実行した後に形成される最大の 2 進数 (おそらく 0) は B です。あなたのタスクは、文字列 A によって表される値が K 回目の B と等しくなるように実行できる巡回シフトの数を決定することです。

入力形式:

1 行目: テスト ケースの数を示す単一の整数 T 各テスト ケースについて: 1 行目: スペースで区切られた 2 つの整数 N と K 2 行目: 文字列を示す A

出力フォーマット:

テスト ケースごとに、文字列 A で表される値が K 回目の B と等しくなるように実行された巡回シフト演算の回数を表す 1 つの整数を含む 1 行を出力します。

コード:

import math


def value(s):
    u = len(s)
    d = 0
    for h in range(u):
        d = d + (int(s[u-1-h]) * math.pow(2, h))
    return d


t = int(input())
for i in range(t):
    x = list(map(int, input().split()))
    n = x[0]
    k = x[1]
    a = input()
    v = 0
    for j in range(n):
        a = a[1:] + a[0]
        if value(a) > v:
            b = a
            v = value(a)
    ctr = 0
    cou = 0
    while ctr < k:
        a = a[1:] + a[0]
        cou = cou + 1
        if a == b:
            ctr = ctr + 1
    print(cou)
4

2 に答える 2