fork download
  1. =begin
  2.  
  3. 466 デフォルトの名無しさん 2020/05/09(土) 20:03:47.46 ID:slqshlLL
  4.   お題
  5.   文字列Sが与えらえる。Sの部分列に"odai"は何個あるか?
  6.  
  7.   [1] odadai => 3
  8.   部分列は以下の3通り
  9.   oda__i
  10.   od__ai
  11.   o__dai
  12.  
  13.   [2] odaiodai => 5
  14.  
  15.   [3] ooooddddaaaaiiii => 256
  16.  
  17.   [4] daioadiao => 0
  18.  
  19. =end
  20.  
  21. $ans = 0
  22.  
  23. def combi( pa, i = 0, n = -1 )
  24. pa[i].each{|pn|
  25. next if pn <= n
  26. if i < pa.length - 1
  27. combi( pa, i+1, pn )
  28. next
  29. end
  30. $ans += 1
  31. }
  32. end
  33.  
  34. def solve( pat, str )
  35. pa = []
  36. i = 0
  37. n = 0
  38. pat.each_char{|ch|
  39. pn = []
  40. while( n = str.index(ch,n) )
  41. pn << n
  42. n += 1
  43. end
  44. break if pn.empty? # 解無し
  45. pa << pn
  46. i += 1
  47. n = pn.min
  48. }
  49. $ans = 0
  50. combi( pa ) if pa.size == pat.size
  51. puts $ans
  52. end
  53.  
  54. pat = "odai"
  55. solve( pat, "odadai" ) #=> 3
  56. solve( pat, "odaiodai" ) #=> 5
  57. solve( pat, "ooooddddaaaaiiii" ) #=> 256
  58. solve( pat, "daioadiao" ) #=> 0
  59.  
  60. =begin
  61.  
  62. o d a d a i
  63. o 1 0 0 0 0 0 0
  64. d 0 1 0 1 0 0 1,3
  65. a 0 0 1 0 1 0 2,4
  66. i 0 0 0 0 0 1 5
  67. 0 1 2 3 4 5
  68. [[0], [1, 3], [2, 4], [5]]
  69.  
  70. o d a i o d a i
  71. o 1 0 0 0 1 0 0 0
  72. d 0 1 0 0 0 1 0 0
  73. a 0 0 1 0 0 0 1 0
  74. i 0 0 0 1 0 0 0 1
  75. [[0, 4], [1, 5], [2, 6], [3, 7]]
  76.  
  77. ooooddddaaaaiiii
  78. [[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11], [12, 13, 14, 15]]
  79.  
  80. daioadiao
  81. [[3, 8], [5], [4, 7], [6]]
  82. [[3, 8], [5], [7]] # 枝刈り 1passで解無し確定
  83.  
  84. =end
  85.  
Success #stdin #stdout 0s 6484KB
stdin
Standard input is empty
stdout
3
5
256
0