0 はじめに
プログラミングコンテストチャレンジブック (通称、蟻本) は日本の競技プログラミングの普及に多大な貢献を果たしています。多くの競技プログラマたちが蟻本を手に取りながらコンテストの世界に没入して行きます。しかしながら発売から 6 年以上経過する間に競技プログラミング界隈には大きな変化がありました。蟻本的に影響が大きいのは以下の点です:
今回はこの完全解決を試みます。具体的には、蟻本に載っている例題たち (ほとんどすべて POJ 上の問題です) を AtCoder 上でジャッジできる問題に対応付けようという試みです。今回は上級編を扱います。AtCoder 上で見つからなかったものは AOJ, yukicoder 上の問題も載せています。
【注意】
-
本記事の趣旨からしてどうしてもネタバレ問題は生じてしまいますので、それについては了承いただければと思います。
-
今後随時更新していきますので、各問題の解説などの参考記事やよりよい問題案などの意見をガンガン募集しています。
【シリーズ】
- AtCoder に登録したら次にやること ~ これだけ解けば十分闘える!過去問精選 10 問 ~
- AtCoder 版!蟻本 (初級編)
- AtCoder 版!蟻本 (中級編)
- AtCoder 版!蟻本 (発展的トピック編)
4 さらに極める! --- 上級編
4-1 より複雑な数学的問題
####例題 4-1-1 ランダムウォーク
【キーワード】
- 期待値
- 連立一次方程式
【AtCoder 上の類題】
- AOJ 2171 Strange Couple (AOJ の問題ですが例題のランダムウォークに極めて近いです)
- Indeedなう 2015 E Page Rank (特殊な連立一次方程式を解きます)
- codeflyer 2018 本選 D 数列 XOR (掃き出し法に関する理解を問います)
- AOJ 2530 Reverse Game (例題 3-2-4 の類題でも簡単に触れた F2 体上の連立一次方程式です、しかしサイズが大きいので bitset 高速化を用います)
【コメント】
連立一次方程式を解いたりする問題です。双六のような確率的挙動が出て来ると連立一次方程式を解くことになるケースが多いイメージがあります。
参考記事:
- 競技プログラミングのための線形代数 (amylase さん)
- 競技プログラミングにおける確率・期待値問題まとめ (はまやんさん)
- 競技プログラミングにおける連立方程式問題まとめ (はまやんさん)
####例題 4-1-2 mod 演算あれこれ, Fermat の小定理, 中国剰余定理
【キーワード】
- nCr
- mod_inverse
- Fermat の小定理、Euler の定理
- 中国剰余定理、連立線形合同方程式
【AtCoder 上の類題】
- ABC 024 D 動的計画法 (nCr に関する式変形をします)
- AGC 001 E BBQ Hard (難しめの二項係数計算をします)
- yukicoder 0186 中華風 (Easy) (中国剰余定理ライブラリの verify に)
- AOJ 2659 箸 (中国剰余定理を繰り返します)
- SRM 449 DIV1 Hard StairsColoring (カタラン数のよい例ではありますが、最後が少し面倒です)
- Japan Alumni Group Summer Camp 2013 Day 3 D Fast Division (Fermat の小定理です)
- Japan Alumni Group Summer Camp 2015 Day 4 D Identity Function (Fermat の小定理も、Euler の定理も使います、Euler の定理の部分は離散対数を用いてもよいです)
- 2017 Tenka1 F ModularPowerEquation!! (Euler の定理を用いた考察をします、問題の再帰的な構造を見出します)
【コメント】
nCr に関わる問題や、中国剰余定理・連立線形合同方程式を用いる問題などです。この辺りの話題についてもよい記事が豊富にあるので紹介します:
- 数え上げテクニック集の「14. 二項係数のテクニック」 (DEGwer さん)
- nCr mod mの求め方 (uwi さん)
- 整数テクニック集 (kirika さん)
- 競技プログラミングにおける数学的問題まとめ (はまやんさん)
- 競技プログラミングにおける中国剰余定理問題まとめ (はまやんさん)
####例題 4-1-3 包除原理
【キーワード】
- 数え上げ
- 包除原理
【AtCoder 上の類題】
- ABC 066 D 11 (包除原理の最も簡単な場合、すなわちダブルカウントを除く問題です)
- ABC 003 D AtCoder社の冬 (包除原理の練習によさそうです)
- yukicoder No.0391 CODING WAR (スターリング数です)
- ARC 096 E Everything on It (スターリング数も登場します、包除原理の芸術です)
- Codeforces 198 DIV1 C Iahub and Permutations (撹乱順列の面白い問題です)
- 天下一 2013 決勝 D 天下一ボディービルコンテスト (包除原理 + DP です)
- AOJ 2136 Webby Subway (彩色数です)
【コメント】
包除原理を用いる問題です。典型的なものとしては「第二種スターリング数の導出」や「撹乱順列数え上げ」などがあります。少し難しくなると DP が絡むイメージがあります。他に高度な話題としては、彩色数や高速ゼータ変換などがあります。
参考記事:
- 数え上げテクニック集の「15. 包除原理」 (DEGwer さん)
- 包除原理 - 解ける数え上げの範囲を広げよう - (tsutaj さん)
- 競技プログラミングにおける包除原理問題まとめ (はまやんさん)
####例題 4-1-4 周期的でない文字列の数え上げ
【キーワード】
- 数え上げ
- 包除原理
- 約数系包除 (DEGwer さんの数え上げテクニック集より)
【AtCoder 上の類題】
- ABC 020 D LCM Rush (比較的易しめの約数系包除です)
- ARC 064 F Rotated Palindromes
- [SRM 305 DIV1 Hard PowerCollector](SRM 305 DIV1 Hard PowerCollector)
- SRM 626 DIV1 Hard ReflectiveRectangle
【コメント】
包除原理のうち、特に約数に関係するものです。メビウス関数が登場するイメージがあります。蟻本や DEGwer さんの数え上げテクニック集に詳しい記載があります。
####例題 4-1-5 石の塗り方の数え上げ
【キーワード】
- ポリアの数え上げ定理
- 部分群のテクニック (DEGwer さんの数え上げテクニック集より)
【AtCoder 上の類題】
【コメント】
「ちょうど k 個分ずつ出て来る」みたいなことを利用する問題です。DEGwer さんの pdf のように「部分群のテクニック」と広くとらえるのはすごく面白いと思いました。
4-2 ゲームの必勝法を編み出せ!
####例題 4-2-1 コインのゲーム1
【キーワード】
- DP
- ゲーム
- ゲーム DP
【AtCoder 上の類題】
- TDPC B ゲーム (初級編でも挙げました)
- ABC 025 C 双子と○×ゲーム (ゲーム DP)
- ARC 038 B マス目と駒 (ゲーム DP)
- ARC 085 D ABS (実は O(1) で解けますが、条件反射でゲーム DP を書けるとすぐに解けます)
- AOJ 2376 DisconnectedGame (面白いです)
- ARC 038 D 有向グラフと数 (状態がループするので後退解析します)
- AOJ 1377 Black and White Boxes (去年の ICPC Asia で出題されて話題になった Hackenbush です)
- AGC 010 F Tree Game (E 問題に比べれば多少考えやすい気がします)
【コメント】
ゲームに関する DP です。難しい問題でなければゲーム木探索を理解していれば簡単です。
参考資料
####例題 4-2-2 A Funny Game (POJ No.2484)
【キーワード】
- ゲーム
- 簡単な表式で解けるゲーム
- 対称戦略 (相手のマネをする)
【AtCoder 上の類題】
- AGC 020 A Move and Win (AtCoder では頻出のパリティに関するよい例題です)
- ABC 059 D Alice&Brown (実験をすると見えて来ます)
- AGC 014 D Black and White Tree (面白いです)
- AGC 002 E Candy Piles (どこに挙げるか迷いました、最終的にはシンプルな判定法になります)
【コメント】
explicit に解けるタイプのゲームです。A Funny Game はひたすら相手のマネをする戦略をとるのがよいゲームでした。必勝法が簡単な表式で表せるタイプのゲームでは、このような対称戦略を考えることは頻出のイメージです。ここでは数学的考察によって必勝法がシンプルに言い表せるタイプの問題を集めました。
####例題 4-2-3 Euclid's Game (POJ No.2348)
【キーワード】
- ゲーム
- 自由度の観点から選べる手が実質的に高々 2 通りしかない
【AtCoder 上の類題】
- ARC 085 D ABS (ゲーム DP でも挙げた問題ですが、O(1) で解けます、問題の構造は Euclid's Game によく似ています)
- AGC 010 D Decrementing (難しめですが、結局選べる手が高々 2 通りしかないゲームです)
【コメント】
一見探索領域が広くてメモ化もできなくて難しそうですが、実質的に選べる手が高々 2 通りしかないタイプのゲームです。
####例題 4-2-4 Nim
【キーワード】
- ゲーム
- Nim
【AtCoder 上の類題】
- ARC 013 C 笑いをとれるかな? (Nim の例題です)
- yukicoder No.002 素因数ゲーム (Nim)
- yukicoder No.524 コインゲーム (Nim)
- HackerRank Misère Nim (Misere Nim です)
- Japan Alumni Group Spring Contest 2014 J Unfair Game (Nim の場合分けゲーです)
【コメント】
すごく有名な問題 Nim です。なお最後に石を取ると負けとしたバージョンを Misere Nim と呼ぶようです。
- Nim (sigma さん)
####例題 4-2-5 Georgia and Bob (POJ No.1704)
【キーワード】
- Nim
- 時々見るタイプの Nim
【AtCoder 上の類題】
- SRM 309 DIV1 Hard StoneGameStrategist (見た目違いますが Georgia and Bob と同じ問題です)
- Codeforces 417 DIV2 E Sagheer and Apple Tree (これの列バージョンをずっと前に出題しようと考えていたのですがお蔵入りです)
【コメント】
時々このタイプの Nim を見る気がします。類題として挙げた 2 題はどちらも見た目は大分違いますが本質的には Georgia and Bob と同型な問題です。
####例題 4-2-6 コインのゲーム2
【キーワード】
- ゲーム
- Nim
- Grundy 数
【AtCoder 上の類題】
- yukicoder No.103 素因数ゲーム リターンズ (Grundy 数を求める例題です)
- yukicoder No.102 トランプを奪え (Grundy 数を求めます)
- ARC 038 C 茶碗と豆 (104 点解法は高速化します)
- AGC 017 D Game on Tree (頑張って求めます)
- AGC 016 F Games on DAG (難しいです)
【コメント】
複数盤面を同時に処理するゲームに使える一般的なテク Grundy です!
####例題 4-2-7 Cutting Game (POJ No.2311)
【キーワード】
- ゲーム
- Nim
- Grundy 数
- 分裂のある Grundy 数
【AtCoder 上の類題】
- yukicoder No.361 門松ゲーム2 (比較的 Cutting Game に近いです)
- yukicoder 0153 石の山 (分裂のある Grundy 数のいい感じの例題です)
- ARC 087 E Prefix-free Game (超良問だと思います)
【コメント】
Grundy 数は盤面の分裂がある場合に真価を発揮するイメージです!
ゲーム全般の問題集です。またゲーム系問題への入門として、HackerRank によい教材があるようです:
- HackerRank Game Theory の勧め (はまやんさん)
- 競技プログラミングにおけるゲーム問題まとめ (Nim,Grundy数,後退解析) (はまやんさん)
4-3 グラフマスターへの道
####例題 4-3-1 Popular Cows (POJ No.2186)
【キーワード】
- 強連結成分分解
【AtCoder 上の類題】
- JOI 2006 本選 D 最悪の記者 (DAG のトポロジカルソートです、AOJ 0519 に同じ)
- AOJ Course Strongly Connected Components (強連結成分分解の verify に)
- TDPC R グラフ (強連結成分分解して DP します。フローでも解けるので例題 3-5-9 でも挙げました)
- [SRM 608 DIV1 Medium BigO](SRM 608 DIV1 Medium BigO) (SRM の問題ですがとても面白いです)
【コメント】
有向グラフに強連結成分分解を行い、強連結成分を 1 点につぶすと DAG になります。DAG 上で DP したりなど、色んな問題が出題されます。
####例題 4-3-2 Priest John's Busiest Day (POJ No.3683)
【キーワード】
- 強連結成分分解
- 2-SAT
【AtCoder 上の類題】
- yukicoder No.274 The Wall (2-SAT を試すよい例題です)
- yukicoder No.470 Inverse S+T Problem (2-SAT です)
- ARC 069 F Flags (2-SAT です)
【コメント】
強連結成分分解を用いる典型例として 2-SAT があります。2-SAT 制約は Project Selection Problem (燃やす埋める) とも相性がよいです。
参考記事:
- 競技プログラミングにおける有向グラフに関する問題まとめ (強連結成分分解, 最小パス被覆, Dilworthの定理, トポロジカルソート) (はまやんさん)
- 競技プログラミングにおける2-SAT問題まとめ (はまやんさん)
####例題 4-3-3 Housewife Wind (POJ No.2763)
【キーワード】
- ツリー上のクエリ
- LCA
- Euler Tour
- ダブリング
【AtCoder 上の類題】
- ABC 014 D 閉路 (LCA を試すよい例題です)
- KUPC 2015 J MODクエリ (LCA 関連のダブリングをするか、HL 分解をします)
- JOI 2011 本選 E JOI 国のお祭り事情 (色んな解法が考えられます, AOJ 0575 に同じ)
- 天下一プログラマーコンテスト2015 本戦 F 根付き木のみさわさん (Euler Tour)
- NJPC 2017 H 白黒ツリー (Euler Tour)
- UTPC 2013 I 支配と友好 (Euler Tour)
- square869120Contest #5 H Percepts of Atcoder (ダブリングをします、HL分解的な発想に基づいているようです)
- JOI 2015 春合宿 day2-3 道路整備 (色んなアルゴリズムを総動員します、二重辺連結成分分解も、問題はここ)
- JOI 2017 春合宿 day2-3 鉄道旅行 (最後に LCA のようなものを求めるダブリングに近いことをします、問題はここ)
【コメント】
ツリー上のクエリに関する問題です。典型的にはダブリング、オイラーツアーから、少しよく見るものに HL 分解などがあります。
参考記事:
- 完全制覇・ツリー上でのクエリ処理技法 (iwi さん)
- Heavy-Light Decomposition (beet さん)
- 競技プログラミングにおけるLCA問題まとめ (はまやんさん)
- 競技プログラミングにおけるオイラーツアー問題まとめ (はまやんさん)
- 競技プログラミングにおけるHL分解まとめ (はまやんさん)
4-4 厳選!頻出テクニック (2)
####例題 4-4-1 Largest Rectangle in a Histogram (POJ No.2559)
【キーワード】
- ヒストグラム長方形面積最大化
- stack
【AtCoder 上の類題】
- KUPC 2013 D カーペット (ほぼそのものな問題です)
- ARC 081 F Flip and Rectangles (ヒストグラム長方形面積最大化に帰着されます)
- ABC 064 D Insertion (括弧列に関する例題です)
- ARC 076 E Connected? (見た目違いますが結局、括弧列の問題になります)
【コメント】
ナイーブにやると O(n^2) かかる処理を stack を用いて O(n) で済ませるテクニックです。類似の話題として最大正方形の面積 - 正方形探索もあります。他に stack を用いて実施できる典型的な問題として括弧列に関する問題があります。
####例題 4-4-2 スライド最小値
【キーワード】
- スライド最小値
- deque
【AtCoder 上の類題】
- ARC 077 C pushpush (deque が使える問題です)
- ARC 005 C 器物損壊!高橋君 (0-1 BFS に deque が使えます、2 つの queue を用いてもよいです)
【コメント】
DP の高速化テクニックとしてよく見るスライド最小値技法です。スライド最小値そのものの問題は見つからなかったですが、ここでは deque が使えそうな問題を挙げます。
####例題 4-4-3 個数制約付きナップサック
【キーワード】
- DP
- deque
- スライド最小値を用いた DP 高速化
【AtCoder 上の類題】
- CODE FESTIVAL 2016 Tournament Round 3 A ストラックアウト
- JOI 2014 予選 F 財宝 (AOJ 0613 に同じ)
- COLOCON Colopl programming contest 2018 D すぬけそだて――トレーニング―― (より単純な解法も)
- JOI 2009 本選 E ダンジョン (deque を使う O(n) 解法があるようです、AOJ 0553 に同じ)
- treeone カット問題: おまけに
【コメント】
DP 高速化技法としてよく見られる手法の 1 つ、スライド最小値 (他に累積和, インライン DP, Convex Hull Trick など) です。多くの場合、segtree を用いた高速化もできますが、スライド最小値が決まると segtree 高速化よりも計算量オーダーを落とせます。
####例題 4-4-4 K-Anonymous Sequence (POJ No.3709)
【キーワード】
- DP
- Convex Hull Trick を用いた DP 高速化
【AtCoder 上の類題】
- COLOCON -Colopl programming contest 2018 Final C スペースエクスプローラー高橋君 (DP 高速化ではないですが CHT のシンプルな例題です)
- yukicoder No.409 ダイエット
- Japan Alumni Group Summer Camp 2015 Day 4 I Live Programming (実はダイエットとほぼ同じです)
- JOI 2017 春合宿 day3-1 長距離バス (問題はここ)
- ARC 066 F Contest with Drinks Hard (分割統治法も絡みます)
【コメント】
DP 高速化技法としてよく見られる手法の 1 つ、Convex Hull Trick です。
DP 高速化関連記事:
- DP高速化 (フェリンさん)
- Convex-Hull Trick (satanic さん)
- 難しい典型テクとか (とざんさん)
- 数え上げテクニック集の「11. 高速化のテクニック」 (DEGwer さん)
- 動的計画法高速化テクニック(オフライン・オンライン変換) (前原さん)
- 競技プログラミングにおける動的計画法更新最適化まとめ(CHT, MongeDP, AlianDP, インラインDP, きたまさ法) (はまやんさん)
####例題 4-4-5 巡回スケジューリング
【キーワード】
- ダブリング
【AtCoder 上の類題】
- ABC 013 D 阿弥陀 (感覚を掴むのにいい感じの問題です)
- ARC 060 E 高橋君とホテル (いい感じです)
- UTPC 2012 H 区間スケジューリングクエリ (面白いです)
- JAG Practice Contest for ACM-ICPC Asia Regional 2015 E Shifting a Matrix (英語ですがいい感じです)
【コメント】
べき乗法、行列累乗、LCA などでもおなじみのダブリングを用いた DP です。
参考記事:
- ダブリング (satanic さん)
4-5 工夫を凝らして賢く探索
####例題 4-5-1 数独 (POJ 2676, 2918, 3074, 3076)
【キーワード】
- 探索
- 探索順序を工夫する
- バックトラック
【AtCoder 上の類題】
- UTPC 2013 E 2-SAT (実は素直な探索で解けて、計算量の見積りが本質です)
- JOI 2008 予選 D 薄氷渡り (見積もり大事です、AOJ 0535 に同じ)
- JOI 2009 予選 F 方向音痴のトナカイ (後ろから解くと速いです、AOJ 0548 に同じ)
- AOJ 2026 Divisor is the Conqueror (同じく後ろから解くと速いバックトラックです)
- AOJ 2443 ReverseSort (前と後ろの両方から攻める両側探索と呼ばれているものです)
- AOJ 0091 Blur (AOJ Volume 0 で最難と有名です、integrality がよくわからないですが単体法でも通りました、ということはもしかしたらフロー解があるのかもです)
【コメント】
基本的には DFS などによる全探索ですが、全探索方法があまり自明でないタイプの問題です。DFS ではしばしば「前の状態に戻す」といことをするので、そこをいかに高速に実現するかが大事になることもあります (そこを強く意識した DFS をバックトラックと言います)。
####例題 4-5-2 Sequence Destroyer (POJ No.1084)
【キーワード】
- 探索
- 枝刈り探索
- 解が悪くなったら打ち切る
- 分枝限定法やα-β法的な枝刈り探索
【AtCoder 上の類題】
- KUPC 2016 F 早解き (α-β 的なことをします)
- Japan Alumni Group Summer Camp 2013 Day 4 E Optimal alpha beta pruning (α-β します)
- ABC 032 D ナップサック問題 (DP や半分全列挙で解きますが分枝限定法でまとめて解くこともできます)
- AOJ 1131 Unit Fraction Partition (枝刈りをすると通る系です)
- JAG Practice Contest for ACM-ICPC Asia Regional 2013 J Magical Switches (枝刈り探索しますが計算時間の指数の底を評価できたりして面白いです)
【コメント】
分枝限定法やα-β法に代表されるような、「解が悪くなったら打ち切る」系の枝刈り探索をする問題です。計算量オーダーが不明になることが多く出題側も苦心しそうなタイプの問題です。ここではもっと広く枝刈り探索に関する問題を載せました。
参考記事:
- 競技プログラミングにおける枝刈り問題まとめ (はまやんさん)
####例題 3-5-3 AとIDA
【キーワード】
- AとIDA
【AtCoder 上の類題】
- UTPC 2013 J K番目の閉路 (A*が本質的に計算量を改善する問題で面白いです)
【コメント】
A* や IDA* によって DFS や BFS を高速化します。
4-6 分けて解いてまとめる! "分割統治法"
####例題 4-6-1 バブルソートの交換回数
【キーワード】
- 分割統治法
【AtCoder 上の類題】
- AOJ Course The Number of Inversions (バブルソートの交換回数そのものです)
- UTPC 2012 I 最短路クエリ (面白いです)
- ARC 066 F Contest with Drinks Hard (Convex Hull Trick も絡みます、難しめです)
- JOI 2017 春合宿 day1-2 港湾設備 (二部グラフ判定を頑張って高速化します)
【コメント】
なんとなく Segtree を使ってもできることが多そうなイメージもある分割統治法です。
- 競技プログラミングにおける分割統治法問題まとめ (はまやんさん)
####例題 4-6-2 Tree (POJ No.1741)
【キーワード】
- 分割統治法
- ツリーの重心
- ツリーの重心分解
【AtCoder 上の類題】
- ARC 087 F Squirrel Migration (ツリーの重心に関する数学的問題、包除原理も使います)
- 2018 第4回ドワンゴからの挑戦状 予選 E ニワンゴくんの家探し (ツリーの重心分解)
- DISCO presents ディスカバリーチャンネル コードコンテスト2016 予選 D 道路網 (重心分解)
- AOJ 2559 Minimum Spanning Tree (マージテクや重心分解の典型的良問です)
- AOJ 1330 Never Wait for Weights (データ構造をマージする一般的なテク)
- AGC E Blue and Red Tree (マージテク)
- UTPC 2014 I 盆栽 (マージテク)
- JOI 2012 春合宿 day1-1 ビルの飾り付け 2 (マージテク発祥の問題です、問題はここ)
【コメント】
ツリーの重心分解を用いたツリー上の分割統治法です。データ構造をマージする一般的なテクで解けるケースも多いイメージがあります。また、ツリーの重心の数学的性質を活用するタイプの問題も挙げました。
参考記事:
- ツリーの重心分解 (木の重心分解) の図解
- "データ構造をマージする一般的なテク" とは? (iwi さん)
- やぶについて書きます (紙ペーパーさん)
- 競技プログラミングにおける重心分解問題まとめ (はまやんさん)
- 競技プログラミングにおけるマージテク問題まとめ (はまやんさん)
####例題 4-6-3 最近点対問題 (Uva 10245)
【キーワード】
- 分割統治法
- 平面の分割統治法
- 最近点対問題
【AtCoder 上の類題】
- AOJ 0585 Nearest Two Points (最近点対問題そのものです)
- AOJ 2057 The Closest Circle (最近円対問題です)
- AOJ 1340 Directional Resemblance (三次元になって難しいです)
【コメント】
最近点対問題です。
- 競技プログラミングにおける最近点対問題まとめ (はまやんさん)
4-7 文字列を華麗に扱う
####例題 4-7-1 禁止文字列 <募集中!!!>
【キーワード】
- 文字列 DP
【AtCoder 上の類題】
- Codeforces 201 DIV1 B Lucky Common Subsequence (例題よりやや難しいですが比較的近いです)
- SRM 412 DIV1 Easy ForbiddenStrings (割と例題に近いです)
- SRM 557 DIV2 Hard FoxAndMountain (見た目違いますが結構例題に近いです)
【コメント】
Trie DP の前振りです。ごく自然な DP で解くことができます。競プロの問題としては、通常は複数文字列を禁止パターンとして Trie DP の形で出すものと思われるため、類題はあまり見つからなかったです。AtCoder 上の問題を募集中です。
####例題 4-7-2 DNA Repair (POJ No.3691)
【キーワード】
- 文字列 DP
- Trie 木
【AtCoder 上の類題】
- 天下一プログラマーコンテスト2016本戦 C たんごたくさん (比較的近いです)
- UTPC 2014 E 宝くじ (Trie 木上のツリー DP です)
- ARC 087 E Prefix-free Game (Grundy 数との組み合わせ)
- CODE FESTIVAL 2016 Qual B E Lexicographical disorder (少し難しめです)
【コメント】
例題 4-7-1 から少し発展して Trie 木を構築するタイプの問題です。
####例題 4-7-3 星座 (POJ No.3690)
【キーワード】
- 文字列検索
- ローリングハッシュ
- KMP 法
- Aho-Corasick 法
【AtCoder 上の類題】
- yukicoder No.430 文字列検索 (ロリハでも、Trie でも、Aho-Corasick でもできます、ライブラリ整備に)
- yukicoder No.599 回文かい (ロリハ)
- AOJ 2808 パスワード (ロリハ)
- JOI 2010 春合宿 day2-2 DNA synthesizer (Trie や Aho-Corasick で解きます, 問題はここ)
- Japan Alumni Group Summer Camp 2015 Day 2 F ほぼ周期文字列 (ロリハが楽なようです)
- AOJ 2257 桜詩 願はくは花の下にて春死なむ (Aho-Corasick)
- JAG Practice Contest for ACM-ICPC Asia Regional 2017 H Separate String (Aho-Corasick)
【コメント】
文字列検索関連です。
- 競技プログラミングにおけるハッシュ問題まとめ (はまやんさん)
- ハッシュを衝突させる話 (hos さん)
####例題 4-7-4 Sequence (POJ No.3581)
【キーワード】
- Suffix Array
【AtCoder 上の類題】
- SPOJ SARRAY Suffix Array (高速な SA ライブラリの verify に。昔は SA-IS でないと通らなかったようですが現在はもう少し遅い解法でも通るようです。)
- DISCO presents ディスカバリーチャンネル プログラミングコンテスト2016 予選 C アメージングな文字列は、きみが作る! (SA 以外のところがむしろメインかもですが、辞書順最小な接尾辞を選ぶ考え方は似通っています)
- Japan Alumni Group Summer Camp 2014 Day 4 F Longest Match (SA + segtree です)
- CODE FESTIVAL 2016 Elimination Tournament Round 1 B 数字列をカンマで分ける問題 (SA + 二分探索です)
- RUPC 2018 day H Hth Number (非常に教育的かつ典型的な SA + 二分探索です)
【コメント】
Suffix Array です。Suffix Array を求めるアルゴリズムは様々なものが提案されており、特に $O(n)$ で求められる SA-IS は理論上も実際上も高速です。
####例題 4-7-5 共通部分文字列(POJ No.2217)
【キーワード】
- Suffix Array
- LCP (高さ配列)
【AtCoder 上の類題】
- square869120Contest #2 E 部分文字列 (比較的素直な考察で解ける LCP です)
- yukicoder No.515 典型LCP (LCP + segtree)
- KUPC 2014 K 弱点 (難しめです)
【コメント】
Suffix Array とセットになって使われることの多い LCP です。
####例題 4-7-6 最長回文
【キーワード】
- Suffix Array
- LCP
- 回文
【AtCoder 上の類題】
- ARC 060 F 最良表現 (様々な解法があります)
- Japan Alumni Group Summer Camp 2013 Day 3 H Almost Same Substring (様々な解法があります)
- Japan Alumni Group Summer Camp 2015 Day 2 F ほぼ周期文字列 (ロリハでも、SA+LCP でもできます)
- ARC 050 D Suffix Concat (SA+LCP)
【コメント】
LCP にさらに RMQ を用いると文字列の場所 i, j の接尾辞の先頭何文字が共通しているかを求めることができます。最長回文はそのような LCP 処理を用いる典型的な例です。
文字列全般の問題集です:
4-8 GCJ の問題に挑戦してみよう (3)
各 GCJ の問題たちのキーワードを挙げていきます。この中でも 4-8-5 は一時期流行したテクニックを用いるので類題を挙げます。
####例題 4-8-1 Mine Layer (2008 World Final C)
【キーワード】
- 端から決まる Greedy
【AtCoder 上の類題】
【コメント】
最適化問題の顔をしていますが、実は一意に決まってしまう問題です。
####例題 4-8-2 Year of More Code Jam (2009 World Final A)
【キーワード】
- 期待値
- 期待値の線形性
【AtCoder 上の類題】
- AGC 007 C Pushing Balls (期待値計算を頑張ります、kirika さん提供)
【コメント】
期待値の式変形をひたすら頑張る問題です。
####例題 4-8-3 Football Team (2009 Round 3 C)
【キーワード】
- グラフ
- 彩色数
- 二部グラフ判定
- 平面グラフ
- 四色定理
- 三彩色問題
【AtCoder 上の類題】
【コメント】
グラフの彩色に関する問題です。
####例題 4-8-4 Endless Knight (2008 Round3 D)
【キーワード】
- 数え上げ
- 包除原理
- 包除原理 + DP
【AtCoder 上の類題】
【コメント】
包除原理を用いる例題です。今の時代となっては比較的典型の部類に入りそうです。
####例題 4-8-5 The Year of Code Jam (2008 World Final E)
【キーワード】
- フロー
- 最小カット
- Project Selection Problem (燃やす埋める)
- 半分だけ変数変換して「燃やす埋める」が使える形にするテク
【AtCoder 上の類題】
【コメント】
蟻本のラストを飾る問題です!!!
GCJ 2008 World Final で最も正答者数の少なかった難問ですが、この問題が世に知れ渡って以降、典型テクニックとして理解されるようになりました。
- 最小カットを使って「燃やす埋める問題」を解く (診断人さん)
- LPとグラフと定式化 (とこはるさん)
謝辞
蟻本の例題たちを AtCoder の問題に結び付け、さらに類題を加える試みをしてみました。
本記事を執筆するにあたり、たくさんの方に支えていただきました。本記事の企画に賛同していただいた秋葉さん、これほどまでに素敵な蟻本を執筆してくださった iwi さん、wata さん、kita_masa さん、問題案などを提供していただいた yumechi さん、はむこさん、ヘクトさん、きゅうりさん、とこはるさん、くぬーさん、くちもちとくらさん、kirika さん、n_vip さん、E869120 さん、square10011 さん、nadare さん、リンク切れなどのミスを指摘してくれた Moko さん、くちもちとくらさん、好意的なコメントを寄せていただいた TL の皆さん、いつも楽しいコンテストを開催してくださっている AtCoder 社の方々、読んでいただいている読者の皆さん、そして競技プログラミングに関わるすべての方々への感謝の想いでいっぱいです。今後ますますの競技プログラミング界の発展を願って、むすびの言葉とさせていただきます (まだまだ随時更新します)。