異なる部分文字列の最大数


9

説明文

長さnとアルファベットサイズを指定するk>0と、プログラムは、最大数の一意の部分文字列を持つパラメーターを持つ文字列の数を決定する必要があります。の場合k=2、これはOEIS A134457を生成します。

例えば、2210部分文字列を持っている 2222212210221210110、と0、しかし11の合計のために、2それが唯一の10個のユニークな部分文字列を持っているので、二回表示されます。

これは、3つの異なるシンボルを含む長さ4文字列のできるだけ多くが、それには36 tieing列の合計35個の他の文字列との連携00122101および0121。したがって、n=4およびのk=3場合、プログラムは36を出力するはずです。

テストケース

n    k    output

0    5    1
1    3    3
5    1    1
9    2    40
2    3    6
5    5    120

3
いくつか例を挙げていただけますか?その非常に短い説明からの挑戦を理解するのはちょっと難しいです。
ETHproductions 2017

そうではないでしょうn=2k=3出力9 11,12,21,22,31,32,33,13,23:?
veganaiZe 2017

@veganaiZe 2桁の数字に部分文字列が繰り返されています。
user1502040 2017

回答:



3

Pyth、12バイト

l.Ml{.:Z)^UE

オンラインでお試しください。

純粋な総当たり。

説明

  • 暗黙的:Qプログラムに追加します。
  • 暗黙的:の入力行(n)を読み取って評価しQます。
  • E:入力行(k)を読み取って評価します。
  • U:範囲を取得します[0, ..., k-1]
  • ^:のすべてのn長さの文字列を取得します[0, ..., k-1]
  • .M:関数の最大値を与えるものを見つけますf(Z)
    • .:Z:の部分文字列を見つける Z
    • {:重複を削除
    • l:一意の部分文字列の数を取得します
  • l:そのような文字列の数を取得する

2

Mathematica、96バイト

Last[Last/@Tally[Length@Union@Flatten[Table[Partition[#,i,1],{i,s}],1]&/@Tuples[Range@#2,s=#]]]&

2

Haskell、82バイト

import Data.Lists
l=length
n#k=l$argmaxes(l.nub.powerslice)$mapM id$[1..k]<$[1..n]

使用例:9 # 2-> 40

使い方:

       [1..k]<$[1..n]  --  make a list of n copies of the list [1..k]
      mapM id          --  make a list of all combinations thereof, where
                       --  the 1st element is from the f1st list, 2nd from 2nd etc
  argmaxes             --  find all elements which give the maximum value for function:
     l.nub.powerslice  --    length of the list of unique sublists
l                      --  take the length of this list
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.