前書き
この課題では、一般的な文字列のサブシーケンスを見つけることがタスクです。サブシーケンスは必ずしも連続しているわけではなく、文字列を「ラップアラウンド」して、その終わりを超えて最初からやり直すこともできます。ただし、ラップの数を最小限に抑える必要があります。
より正式には、let uとvbe任意の2つの文字列、およびk ≥ 0整数です。私たちuは、のようなkラッピングのサブシーケンスでありv、のような別個のインデックスが存在し、最大でインデックスが満たされると言います。これは、左から右に移動し、途中でキャラクターの一部を選択し、ほとんどの時間をラップすることで(同等に、最大でスイープすることで)内部で見つけることができることを意味します。ラップアラウンドの後でも、複数の文字を選択することはできません。また、-wrappingサブシーケンスは、私たちがよく知っている通常のサブシーケンスであることに注意してください。i1, i2, ..., ilen(u)u == v[i1] v[i2] ... v[ilen(u)]kijij > ij+1uvkk+1v0
タスク
あなたの入力は二つの非空の英数字文字列であるuとv、そしてあなたの出力は、整数最小となるkようuであるkの-wrappingサブシーケンスv。そのようなものkが存在しない場合、出力はになります-1。
例
入力u := xyzyxzzxyxとを考慮してくださいv := yxzzazzyxxxyz。uin の文字をv貪欲な方法で探し始めたら、約3回ラップします。
yxzzazzyxxxyz
>─x─────y────z┐
┌─────────────┘
└y───────x────┐
┌─────────────┘
└──zz─────x─y─┐
┌─────────────┘
└──────────x──>
したがって、正しい出力は最大で3です。一番左の文字xが1回選択され、2回目のスイープでは再利用できないため、どのように無視されるかに注意してください。ただし、ラップアラウンドが2つしかない短い方法があります。
yxzzazzyxxxyz
>──────────xyz┐
┌─────────────┘
└yxzz────x────┐
┌─────────────┘
└───────y─x───>
1回のラップアラウンド(つまり、2回のスイープ)では不十分であることが判明したため、正しい出力は2です。
ルールとボーナス
関数または完全なプログラムのいずれかを記述でき、必要に応じて入力の順序を変更することもできます。最小のバイトカウントが優先され、標準の抜け穴は許可されません。
合計10秒未満ですべてのテストケースを計算すると、-10%のボーナスがあります。私のマシンで不明瞭なケースをテストします。Pythonでのリファレンス実装には約0.6秒かかります。1.86 GHzデュアルコアCPUを搭載した7歳のラップトップを使用していますが、これを考慮する必要があります。
テストケース
"me" "moe" -> 0
"meet" "metro" -> -1
"ababa" "abaab" -> 1
"abaab" "baabaa" -> 1
"1c1C1C2B" "1111CCCcB2" -> 3
"reverse" "reserved" -> 2
"abcdefg" "gfedcba" -> 6
"xyzyxzzxyx" "yxzzazzyxxxyz" -> 2
"aasdffdaasdf" "asdfddasdfsdaafsds" -> 2
xは3つの異なるスイープで使用されるため、無効です。一度だけ使用できます。