SlideShare a Scribd company logo
1 of 10
Download to read offline
会津合宿2015 Day3
F: みこみー文字列
原案・解説・問題文:井上
解答:井上・鈴木・田中
問題概要
• 文字列Sが与えられる
• S = ABABAとなるような非空文字列A, Bがある
か判定せよ
• あるなら|AB|が最小になるものを出力せよ
• 制約: 1 ≤ S ≤ 106
想定 TLE 解法: 全探索
• Aの長さを決め打ちする (1 ≤ |A| ≤ |S|/3)
• するとBの長さは一意 (B = (|S| - 3|A|) / 2)
• あとは以下が一致するか調べればよい
• S[0:A) と S[A+B:2A+B) と S[2A+2B:3A+B)
• S[A:A+B) と S[2A+B:2A+2B)
• O(N)通りについて、長さO(N)の文字列比較を行
うのでO(N2)

→ N = 106なのでTLE
想定解法: ローリングハッシュ
• 部分文字列 s[l:r) に以下のようなハッシュ
値h(l,r)を割り当てる
• h(l,r) = Σl≤i≤r (int)si * p(r-i) mod M
• p, Mは互いに素 (基本p<Mで、素数とか)
• このハッシュ値が一致 ⇒ 文字列が一致
想定解法: ローリングハッシュ
• h(l,r) = Σl≤i≤r (int)si * p(r-i) mod M
• このハッシュ値が一致 ⇒ 文字列が一致
• つまり……以下を調べればよい
• h(0,A) = h(A+B,2A+B) = h(2A+2B,3A+2B)
• h(A,A+B) = h(2A+B,2A+2B)
• 数値なのでO(1)で判定できる
• ただし、ハッシュ一致 ⇐ 文字列一致は言えない
• まともな p, M を使えば確率的にほとんど起こ
らない
想定解法: ローリングハッシュ
• h(l,r) = Σl≤i≤r (int)si * p(r-i) mod M
• けど h を計算するのに O(N) かかるのでは?
• h(l,r) = (h(0,r) - h(0,l) * p(r-l)) mod M
• h(0,i) = h(0,i-1) * p + (int)si

と計算できるので、あらかじめ h(0,i) を
O(N)で計算しておけば h(l,r) の計算は
O(1)
• 全体で O(N)
別解: Suffix Array + LCP +
RMQ
• 接尾辞配列 (SA) を作り、SAで隣との共通部分接
頭辞 (LCP)の長さを記録した配列に対して区間最
小値クエリ (RMQ) を投げる
• S[l1,l1+k) と S[l2, l2+k) の文字列比較をすると
きは、l1とl2に該当するSAのインデックスを区間と
してRMQすると、答えがl1,l2の共通接頭辞の長さに
なる
• これがkより長ければS[l1,l1+k) = S[l2, l2+k)
• 計算量: O( SA構築 + NlogN )
• 蟻本のSA構築は O(Nlog2
N) なのでTLE的に厳しい
余談
• ぶっちゃけナイーブO(N2)が速すぎたので

|S|≤106になった
• のでSA+LCP+RMQは厳しくなった
• 個人的にはこっちもすんなり通したかった
ジャッジ解
• 井上 (C++) 54行 1057B
• 鈴木 (C++) 38行 1035B
• 田中 (C++) 43行 1331B
回答状況
• Accept / Submit
• 11 / 30 (36.7%)
• First Acceptance
• onsite: syumi_plus (01:53)
• online: natsugiri (00:24)

More Related Content

Viewers also liked

Viewers also liked (19)

二分探索をはじめからていねいに
二分探索をはじめからていねいに二分探索をはじめからていねいに
二分探索をはじめからていねいに
 
会津合宿2015Day3:C問題
会津合宿2015Day3:C問題会津合宿2015Day3:C問題
会津合宿2015Day3:C問題
 
会津合宿2015Day3:G問題
会津合宿2015Day3:G問題会津合宿2015Day3:G問題
会津合宿2015Day3:G問題
 
会津合宿2015Day3:B問題
会津合宿2015Day3:B問題会津合宿2015Day3:B問題
会津合宿2015Day3:B問題
 
ACPC2016Day3:C問題
ACPC2016Day3:C問題ACPC2016Day3:C問題
ACPC2016Day3:C問題
 
ACPC2016Day3:G問題
ACPC2016Day3:G問題ACPC2016Day3:G問題
ACPC2016Day3:G問題
 
ACPC2016Day3:D問題
ACPC2016Day3:D問題ACPC2016Day3:D問題
ACPC2016Day3:D問題
 
ACPC2016Day3:E問題
ACPC2016Day3:E問題ACPC2016Day3:E問題
ACPC2016Day3:E問題
 
最短経路問題 & 最小全域木
最短経路問題 & 最小全域木最短経路問題 & 最小全域木
最短経路問題 & 最小全域木
 
会津合宿2015Day3:E問題
会津合宿2015Day3:E問題会津合宿2015Day3:E問題
会津合宿2015Day3:E問題
 
ACPC2016Day3:F問題
ACPC2016Day3:F問題ACPC2016Day3:F問題
ACPC2016Day3:F問題
 
会津合宿2015Day3:D問題
会津合宿2015Day3:D問題会津合宿2015Day3:D問題
会津合宿2015Day3:D問題
 
Introduction to programming
Introduction to programmingIntroduction to programming
Introduction to programming
 
Topological sort
Topological sortTopological sort
Topological sort
 
動的計画法を極める!
動的計画法を極める!動的計画法を極める!
動的計画法を極める!
 
会津合宿2015Day3:A問題
会津合宿2015Day3:A問題会津合宿2015Day3:A問題
会津合宿2015Day3:A問題
 
立命合宿2016Day3:H問題
立命合宿2016Day3:H問題立命合宿2016Day3:H問題
立命合宿2016Day3:H問題
 
動的計画法
動的計画法動的計画法
動的計画法
 
蟻本輪講 データ構造
蟻本輪講 データ構造蟻本輪講 データ構造
蟻本輪講 データ構造
 

More from HCPC: 北海道大学競技プログラミングサークル

More from HCPC: 北海道大学競技プログラミングサークル (20)

写像 12 相
写像 12 相写像 12 相
写像 12 相
 
ACPC 2017 Day3 F: 掛け算は楽しい
ACPC 2017 Day3 F: 掛け算は楽しいACPC 2017 Day3 F: 掛け算は楽しい
ACPC 2017 Day3 F: 掛け算は楽しい
 
ACPC 2017 Day3 D: 優柔不断
ACPC 2017 Day3 D: 優柔不断ACPC 2017 Day3 D: 優柔不断
ACPC 2017 Day3 D: 優柔不断
 
ACPC 2019 Day3 G: Restricted DFS
ACPC 2019 Day3 G: Restricted DFSACPC 2019 Day3 G: Restricted DFS
ACPC 2019 Day3 G: Restricted DFS
 
ACPC 2019 Day3 E: 総和の切り取り
ACPC 2019 Day3 E: 総和の切り取りACPC 2019 Day3 E: 総和の切り取り
ACPC 2019 Day3 E: 総和の切り取り
 
ACPC 2019 Day3 B: パフェ
ACPC 2019 Day3 B: パフェACPC 2019 Day3 B: パフェ
ACPC 2019 Day3 B: パフェ
 
ACPC 2019 Day3 A: 間違い探し
ACPC 2019 Day3 A: 間違い探しACPC 2019 Day3 A: 間違い探し
ACPC 2019 Day3 A: 間違い探し
 
HUPC 2019 Day2 G: 木
HUPC 2019 Day2 G: 木HUPC 2019 Day2 G: 木
HUPC 2019 Day2 G: 木
 
HUPC 2019 Day2 E: ジャム
HUPC 2019 Day2 E: ジャムHUPC 2019 Day2 E: ジャム
HUPC 2019 Day2 E: ジャム
 
HUPC 2019 Day2 H: Revenge of UMG
HUPC 2019 Day2 H: Revenge of UMGHUPC 2019 Day2 H: Revenge of UMG
HUPC 2019 Day2 H: Revenge of UMG
 
HUPC 2019 Day2 F: MOD Rush
HUPC 2019 Day2 F: MOD RushHUPC 2019 Day2 F: MOD Rush
HUPC 2019 Day2 F: MOD Rush
 
HUPC 2019 Day2 C: 串刺し
HUPC 2019 Day2 C: 串刺しHUPC 2019 Day2 C: 串刺し
HUPC 2019 Day2 C: 串刺し
 
HUPC 2019 Day1 F: グリッドの番号
HUPC 2019 Day1 F: グリッドの番号HUPC 2019 Day1 F: グリッドの番号
HUPC 2019 Day1 F: グリッドの番号
 
HUPC 2019 Day1 E: 最短経路の復元
HUPC 2019 Day1 E: 最短経路の復元HUPC 2019 Day1 E: 最短経路の復元
HUPC 2019 Day1 E: 最短経路の復元
 
HUPC 2019 Day1 D: 貪欲が最適?
HUPC 2019 Day1 D: 貪欲が最適?HUPC 2019 Day1 D: 貪欲が最適?
HUPC 2019 Day1 D: 貪欲が最適?
 
HUPC 2019 Day1 C: 短絡評価
HUPC 2019 Day1 C: 短絡評価HUPC 2019 Day1 C: 短絡評価
HUPC 2019 Day1 C: 短絡評価
 
HUPC 2019 Day1 B: 自身の 2 倍
HUPC 2019 Day1 B: 自身の 2 倍HUPC 2019 Day1 B: 自身の 2 倍
HUPC 2019 Day1 B: 自身の 2 倍
 
HUPC 2019 Day1 A: four tea
HUPC 2019 Day1 A: four teaHUPC 2019 Day1 A: four tea
HUPC 2019 Day1 A: four tea
 
Convex Hull Trick
Convex Hull TrickConvex Hull Trick
Convex Hull Trick
 
プログラミングコンテスト基礎テクニック
プログラミングコンテスト基礎テクニックプログラミングコンテスト基礎テクニック
プログラミングコンテスト基礎テクニック
 

会津合宿2015Day3:F問題