Download free for 30 days
Sign in
Upload
Language (EN)
Support
Business
Mobile
Social Media
Marketing
Technology
Art & Photos
Career
Design
Education
Presentations & Public Speaking
Government & Nonprofit
Healthcare
Internet
Law
Leadership & Management
Automotive
Engineering
Software
Recruiting & HR
Retail
Sales
Services
Science
Small Business & Entrepreneurship
Food
Environment
Economy & Finance
Data & Analytics
Investor Relations
Sports
Spiritual
News & Politics
Travel
Self Improvement
Real Estate
Entertainment & Humor
Health & Medicine
Devices & Hardware
Lifestyle
Change Language
Language
English
Español
Português
Français
Deutsche
Cancel
Save
EN
Uploaded by
__math
PPTX, PDF
6,265 views
Palindromic tree
競プロ忘年会 in 東京 2016 で発表したpalindromic tree(eertree, 回文木) についてのスライドです
Technology
◦
Read more
4
Save
Share
Embed
Embed presentation
Download
Downloaded 10 times
1
/ 50
2
/ 50
3
/ 50
4
/ 50
Most read
5
/ 50
6
/ 50
7
/ 50
8
/ 50
9
/ 50
10
/ 50
11
/ 50
12
/ 50
13
/ 50
14
/ 50
15
/ 50
16
/ 50
17
/ 50
18
/ 50
19
/ 50
20
/ 50
21
/ 50
22
/ 50
23
/ 50
24
/ 50
25
/ 50
26
/ 50
27
/ 50
28
/ 50
29
/ 50
30
/ 50
31
/ 50
32
/ 50
33
/ 50
34
/ 50
35
/ 50
36
/ 50
37
/ 50
38
/ 50
39
/ 50
40
/ 50
41
/ 50
42
/ 50
43
/ 50
44
/ 50
45
/ 50
46
/ 50
47
/ 50
48
/ 50
49
/ 50
50
/ 50
More Related Content
PDF
競技プログラミングでの線型方程式系
by
tmaehara
PDF
プログラミングコンテストでのデータ構造
by
Takuya Akiba
PDF
プログラミングコンテストでのデータ構造 2 ~動的木編~
by
Takuya Akiba
PDF
LCA and RMQ ~簡潔もあるよ!~
by
Yuma Inoue
PDF
双対性
by
Yoichi Iwata
PDF
RMQ クエリ処理
by
HCPC: 北海道大学競技プログラミングサークル
PDF
AtCoder Regular Contest 023 解説
by
AtCoder Inc.
PPTX
CODE FESTIVAL 2014 本選 解説
by
AtCoder Inc.
競技プログラミングでの線型方程式系
by
tmaehara
プログラミングコンテストでのデータ構造
by
Takuya Akiba
プログラミングコンテストでのデータ構造 2 ~動的木編~
by
Takuya Akiba
LCA and RMQ ~簡潔もあるよ!~
by
Yuma Inoue
双対性
by
Yoichi Iwata
RMQ クエリ処理
by
HCPC: 北海道大学競技プログラミングサークル
AtCoder Regular Contest 023 解説
by
AtCoder Inc.
CODE FESTIVAL 2014 本選 解説
by
AtCoder Inc.
What's hot
PDF
グラフネットワーク〜フロー&カット〜
by
HCPC: 北海道大学競技プログラミングサークル
PDF
ダブリング
by
satanic
PDF
AtCoder Beginner Contest 022 解説
by
AtCoder Inc.
PDF
指数時間アルゴリズム入門
by
Yoichi Iwata
PDF
色々なダイクストラ高速化
by
yosupo
PDF
AtCoder Regular Contest 039 解説
by
AtCoder Inc.
PDF
様々な全域木問題
by
tmaehara
PDF
Binary indexed tree
by
HCPC: 北海道大学競技プログラミングサークル
PDF
二部グラフの最小点被覆と最大安定集合と最小辺被覆の求め方
by
Kensuke Otsuki
PDF
AtCoder Regular Contest 035 解説
by
AtCoder Inc.
PDF
ユークリッド最小全域木
by
理玖 川崎
PDF
目指せグラフマスター
by
HCPC: 北海道大学競技プログラミングサークル
PDF
AtCoder Regular Contest 018 解説
by
AtCoder Inc.
PDF
AtCoder Beginner Contest 025 解説
by
AtCoder Inc.
PPTX
AtCoder Beginner Contest 002 解説
by
AtCoder Inc.
PDF
Convex Hull Trick
by
HCPC: 北海道大学競技プログラミングサークル
PDF
最大流 (max flow)
by
HCPC: 北海道大学競技プログラミングサークル
PDF
AtCoder Regular Contest 043 解説
by
AtCoder Inc.
PDF
AtCoder Regular Contest 022 解説
by
AtCoder Inc.
PPTX
Chokudai search
by
AtCoder Inc.
グラフネットワーク〜フロー&カット〜
by
HCPC: 北海道大学競技プログラミングサークル
ダブリング
by
satanic
AtCoder Beginner Contest 022 解説
by
AtCoder Inc.
指数時間アルゴリズム入門
by
Yoichi Iwata
色々なダイクストラ高速化
by
yosupo
AtCoder Regular Contest 039 解説
by
AtCoder Inc.
様々な全域木問題
by
tmaehara
Binary indexed tree
by
HCPC: 北海道大学競技プログラミングサークル
二部グラフの最小点被覆と最大安定集合と最小辺被覆の求め方
by
Kensuke Otsuki
AtCoder Regular Contest 035 解説
by
AtCoder Inc.
ユークリッド最小全域木
by
理玖 川崎
目指せグラフマスター
by
HCPC: 北海道大学競技プログラミングサークル
AtCoder Regular Contest 018 解説
by
AtCoder Inc.
AtCoder Beginner Contest 025 解説
by
AtCoder Inc.
AtCoder Beginner Contest 002 解説
by
AtCoder Inc.
Convex Hull Trick
by
HCPC: 北海道大学競技プログラミングサークル
最大流 (max flow)
by
HCPC: 北海道大学競技プログラミングサークル
AtCoder Regular Contest 043 解説
by
AtCoder Inc.
AtCoder Regular Contest 022 解説
by
AtCoder Inc.
Chokudai search
by
AtCoder Inc.
Viewers also liked
PDF
動的計画法入門(An introduction to Dynamic Programming)
by
kakira9618
PPTX
解説:デバッグ
by
理玖 川崎
PDF
高速フーリエ変換
by
AtCoder Inc.
PDF
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
by
Takuya Akiba
PDF
大規模グラフ解析のための乱択スケッチ技法
by
Takuya Akiba
PDF
プログラミングコンテストでの動的計画法
by
Takuya Akiba
PDF
勉強か?趣味か?人生か?―プログラミングコンテストとは
by
Takuya Akiba
PDF
Layer Normalization@NIPS+読み会・関西
by
Keigo Nishida
PDF
IPAB2017 深層学習を使った新薬の探索から創造へ
by
Preferred Networks
動的計画法入門(An introduction to Dynamic Programming)
by
kakira9618
解説:デバッグ
by
理玖 川崎
高速フーリエ変換
by
AtCoder Inc.
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
by
Takuya Akiba
大規模グラフ解析のための乱択スケッチ技法
by
Takuya Akiba
プログラミングコンテストでの動的計画法
by
Takuya Akiba
勉強か?趣味か?人生か?―プログラミングコンテストとは
by
Takuya Akiba
Layer Normalization@NIPS+読み会・関西
by
Keigo Nishida
IPAB2017 深層学習を使った新薬の探索から創造へ
by
Preferred Networks
Similar to Palindromic tree
PDF
鬱くしい日本語のための形態素解析入門
by
Hiroyoshi Komatsu
PDF
[Basic 11] 文脈自由文法 / 構文解析 / 言語解析プログラミング
by
Yuto Takei
PDF
2012.11.17 CLR/H&札幌C++勉強会 発表資料「部分文字列の取得を効率よく!楽に! - fundoshi.hppの紹介と今後の予定 -」
by
Hiro H.
PPTX
Lc ken 20101126
by
Masato Yoshikawa
PPT
Parsing Left Recursive PEG
by
Takayuki Goto
PDF
ゆとりが数週間でC++を始めるようです
by
Eric Sartre
PPTX
A Monolingual Tree-based Translation Model for Sentence Simplification
by
DaikiNishihara
PDF
20111217 gunmaweb#7 エダカリン!
by
ivoryworks .
PDF
自然言語処理はじめました - Ngramを数え上げまくる
by
phyllo
PDF
PEGの回文っぽいExpression
by
Sosuke MORIGUCHI
PDF
アルゴリズムのお勉強 アルゴリズムとデータ構造 [素数・文字列探索・簡単なソート]
by
hixi365
PDF
スペル修正プログラムの作り方 #pronama
by
Hiroyoshi Komatsu
鬱くしい日本語のための形態素解析入門
by
Hiroyoshi Komatsu
[Basic 11] 文脈自由文法 / 構文解析 / 言語解析プログラミング
by
Yuto Takei
2012.11.17 CLR/H&札幌C++勉強会 発表資料「部分文字列の取得を効率よく!楽に! - fundoshi.hppの紹介と今後の予定 -」
by
Hiro H.
Lc ken 20101126
by
Masato Yoshikawa
Parsing Left Recursive PEG
by
Takayuki Goto
ゆとりが数週間でC++を始めるようです
by
Eric Sartre
A Monolingual Tree-based Translation Model for Sentence Simplification
by
DaikiNishihara
20111217 gunmaweb#7 エダカリン!
by
ivoryworks .
自然言語処理はじめました - Ngramを数え上げまくる
by
phyllo
PEGの回文っぽいExpression
by
Sosuke MORIGUCHI
アルゴリズムのお勉強 アルゴリズムとデータ構造 [素数・文字列探索・簡単なソート]
by
hixi365
スペル修正プログラムの作り方 #pronama
by
Hiroyoshi Komatsu
Palindromic tree
1.
Palindromic Tree @__MATH
2.
Palindromic Tree(Eertree)とは •Mikhail Rubinchik
さんが作ったデータ構造 • 昔 codeforces にも参加されていた • 割と最近に発表された、2015年?
3.
何ができるの? •文字列に含まれる全てのユニークな回文を求める • それぞれの出現回数も求められる •i番目が最後尾となるような、異なる長さの回文を求める •構築がオンラインで出来る •空間: O(nσ)
(nは文字列の長さ、 σは文字種) • 入力がランダムな文字列の場合 expected O(√nσ) らしい •計算: O(n)
4.
何ができるの? •文字列に含まれる全てのユニークな回文を求める • それぞれの出現回数も求められる S =
“eertreere” の時 “e” : 5回, ”r” : 3回, ”t” : 1回 “ee” : 2回, “rtr” : 1回, “ere” : 1回 “ertre” : 1回, “eertree” : 1回
5.
何ができるの? •i番目が最後尾となるような、異なる長さの回文を求める S = “eertreere”
の時、i = 5が最後尾となるような回文は “ertre”, ”e” の2個 ◦ 0-indexed
6.
見た目 • S =
“eertreere” の時
7.
見た目 (-1) (0) r t e ee ere reer ertre eertree rtr •
S = “eertreere” の時
8.
見た目 (-1) (0) r t e ee ere reer ertre eertree rtr •
S = “eertreere” の時 •見づらい • 辺を減らして表示
9.
見た目 (-1) (0) r t e ee ere reer ertre eertree rtr •
S = “eertreere” の時 Sに含まれている回文が頂点
10.
見た目 (-1) (0) r t e ee ere reer ertre eertree rtr •
S = “eertreere” の時 Sに含まれている回文が頂点 長さが-1の特殊な頂点 長さが0の特殊な頂点
11.
見た目 (-1) (0) r t e ee ere reer ertre eertree rtr •
S = “eertreere” の時
12.
見た目 (-1) (0) r t e ee ere reer ertre eertree rtr •
S = “eertreere” の時 一つ前の回文の両側に一文字足して 出来る回文に辺を張る
13.
見た目 (-1) (0) r t e ee ere reer ertre eertree rtr •
S = “eertreere” の時 一つ前の回文の両側に一文字足して 出来る回文に辺を張る 長さが1の回文は長さが-1の回文から作る
14.
見た目 (-1) (0) r t e ee ere reer ertre eertree rtr •
S = “eertreere” の時 Suffix Link
15.
見た目 (-1) (0) r t e ee ere reer ertre eertree rtr •
S = “eertreere” の時 頂点の文字列に含まれる 最大の回文接尾辞へsuffix linkを張る Suffix Link
16.
接尾辞 • 文字列の接尾辞とは、(開始位置を異にし終端位置を元の文字 列と同じくする部分文字列) • Wikipedia
より • https://ja.wikipedia.org/wiki/接尾辞配列 • S = “eertre” の時 eertre ertre rtre tre re e
17.
見た目 (-1) (0) r t e ee ere reer ertre eertree rtr •
S = “eertreere” の時 頂点の文字列に含まれる 最大の回文接尾辞へsuffix linkを張る Suffix Link 長さが1の頂点からは、長さ0の頂点へ
18.
見た目 (-1) (0) r t e ee ere reer ertre eertree rtr •
S = “eertreere” の時 頂点の文字列に含まれる 最大の回文接尾辞へsuffix linkを張る Suffix Link 長さが1の頂点からは、長さ0の頂点へ 長さが0の頂点からは、長さ-1の頂点へ
19.
見た目 (-1) (0) r t e ee ere reer ertre eertree rtr •
S = “eertreere” の時 完成 Suffix Link
20.
Palindromic Treeのデータ構造 •木を3つ同時に作っていくデータ構造 • 長さが偶数の頂点と、それらを結ぶ辺で構成される木 •
長さが奇数の頂点と、それらを結ぶ辺で構成される木 • 全ての頂点をsuffix linkで結んだ木 (-1) (0) r t e ee ere rtr
21.
Suffix Link tree 全ての頂点をsuffix
linkで結んだ木 ◦ これが便利 ◦ 公式の呼び方はなさそう? (-1) (0) r t e ee erertr
22.
作り方 (-1) (0) r e ee •
S = “eer” まで完成
23.
作り方 (-1) (0) r e ee •
S = “eer” まで完成 “eer” の最長の回文接尾辞
24.
作り方 (-1) (0) r e ee •
S = “eer” まで完成 “eert” の頂点を作る S += “t”
25.
作り方 (-1) (0) r e ee •
S = “eer” まで完成 “eert” のPalindromic treeを作る • S += “t” • “t” + “r” + “t” は”eert”の回 文接尾辞ではない trt?
26.
作り方 (-1) (0) r e ee •
S = “eer” まで完成 “eert” のPalindromic treeを作る • S += “t” • “t” + “r” + “t” は”eert”の回文接 尾辞ではない • Suffix linkを辿り “(0)”へ移 動
27.
作り方 (-1) (0) r e ee •
S = “eer” まで完成 “eert” のPalindromic treeを作る • S += “t” • “t” + “r” + “t” は”eert”の回文接 尾辞ではない • Suffix linkを辿り “(0)”へ移動 • “t” + “” + “t” は”eert”の回 文接尾辞ではない tt?
28.
作り方 (-1) (0) r e ee •
S = “eer” まで完成 “eert” のPalindromic treeを作る • S += “t” • “t” + “r” + “t” は”eert”の回文接 尾辞ではない • Suffix linkを辿り “(0)”へ移動 • “t” + “” + “t” は”eert”の回文接 尾辞ではない • Suffix linkを辿り “(-1)”へ移 動
29.
作り方 (-1) (0) r e ee •
S = “eer” まで完成 “eert” のPalindromic treeを作る • S += “t” • “t” + “r” + “t” は”eert”の回文接 尾辞ではない • Suffix linkを辿り “(0)”へ移動 • “t” + “” + “t” は”eert”の回文接 尾辞ではない • Suffix linkを辿り “(-1)”へ移動 • “t”は”eert”の回文接尾辞!! t
30.
作り方 (-1) (0) r t
e ee • S = “eertr” まで完成 rtr
31.
作り方 (-1) (0) r t
e ee • S = “eertr” まで完成 rtr “eertr” の最長の回文接尾辞
32.
作り方 (-1) (0) r t
e ee • S = “eertr” まで完成 “eertre” のPalindromic tree を作る • S += “e” rtr
33.
作り方 (-1) (0) r t
e ee • S = “eertr” まで完成 “eertre” の頂点を作る S += “e” “e” + “rtr” + “e” は “eertre” の回文接尾辞 rtr ertre?
34.
作り方 (-1) (0) r t
e ee • S = “eertr” まで完成 “eertre” のPalindromic tree を作る • S += “e” “e” + “rtr” + “e” は “eertre” の回文接尾辞 rtr ertre“eertre” の最長の回文接尾辞
35.
作り方 (-1) (0) r t
e ee • Suffix Linkの追加 • 元いた頂点 “rtr”から、suffix linkを 辿って “r”へ移動 rtr ertre
36.
作り方 (-1) (0) r t
e ee • Suffix Linkの追加 • 元いた頂点 “rtr”から、suffix linkを 辿って “r”へ移動 • “ere” は “ertre”の回文接尾辞 ではない rtr ertre ere
37.
作り方 (-1) (0) r t
e ee • Suffix Linkの追加 • 元いた頂点 “rtr”から、suffix linkを 辿って “r”へ移動 • “ere” は “ertre”の回文接尾辞ではな い • “r”から、suffix linkを辿っ て”(0)”へ 移動 rtr ertre
38.
作り方 (-1) (0) r t
e ee • Suffix Linkの追加 • 元いた頂点 “rtr”から、suffix linkを 辿って “r”へ移動 • “ere” は “ertre”の回文接尾辞ではな い • “r”から、suffix linkを辿って”(0)”へ 移動 • “ee”は”ertre”の回文接尾辞で はない rtr ertre
39.
作り方 (-1) (0) r t
e ee • Suffix Linkの追加 • 元いた頂点 “rtr”から、suffix linkを 辿って “r”へ移動 • “ere” は “ertre”の回文接尾辞ではな い • “r”から、suffix linkを辿って”(0)”へ 移動 • “ee”は”ertre”の回文接尾辞ではない • “(0)”から、suffix linkを辿っ て”(-1)”へ移動 rtr ertre
40.
作り方 (-1) (0) r t
e ee • Suffix Linkの追加 • 元いた頂点 “rtr”から、suffix linkを 辿って “r”へ移動 • “ere” は “ertre”の回文接尾辞ではな い • “r”から、suffix linkを辿って”(0)”へ 移動 • “ee”は”ertre”の回文接尾辞ではない • “(0)”から、suffix linkを辿って”(-1)”へ 移動 • “e”は”ertre”の回文接尾辞!! rtr ertre
41.
何ができるの?(再掲) •文字列に含まれる全てのユニークな回文を求める • それぞれの出現回数も求められる •i番目が最後尾となるような、異なる長さの回文を求める
42.
何ができるの? •文字列に含まれる全てのユニークな回文を求める • 頂点数 -
2 すればよい (0),(-1)の頂点を除く必要あり (-1)(0) r t e ee ere reer ertre eertree rtr
43.
何ができるの? •文字列に含まれる全てのユニークな回文を求める • 頂点数 -
2 すればよい •i番目が最後尾となるような、異なる長さの回文を 求める
44.
何ができるの? •文字列に含まれる全てのユニークな回文を求める • 頂点数 -
2 すればよい •i番目が最後尾となるような、異なる長さの回文を求める • Suffix link treeの深さと一致する • S = “eertreere” の時、i = 5が最後尾となるような回文は “ertre”, ”e” の2個 (-1)(0)eertre
45.
計算量 (-1) (0) r t e ee •
新しい頂点を追加するのにかかる計算量は? rtr
46.
計算量 (-1) (0) r t e ee •
新しい頂点を追加するのにかかる計算量は? • 追加する文字とすでに追加された文字の比較を、 Suffix linkを辿った回数だけ行う • 1文字と1文字の比較はO(1) • そのノードが存在するかの確認 • mapならO(log σ) rtr ertre
47.
計算量 (-1) (0) r t e ee •
新しい頂点を追加するのにかかる計算量は? • 追加する文字とすでに追加された文字の比較を、 Suffix linkを辿った回数だけ行う • 1文字と1文字の比較はO(1) • そのノードが存在するかの確認 • mapならO(log σ) • 新しい頂点にSuffix linkを追加するために、さらにsuffix linkを辿る rtr ertre
48.
計算量 (-1) (0) r t e ee •
新しい頂点を追加するのにかかる計算量は? • 追加する文字とすでに追加された文字の比較を、 Suffix linkを辿った回数だけ行う • 1文字と1文字の比較はO(1) • そのノードが存在するかの確認 • mapならO(log σ) • 新しい頂点にSuffix linkを追加するために、さらにsuffix linkを辿る • 新しい頂点の深さは最大で、 (前の頂点の深さ) - (辿った回数) + 3 rtr ertre
49.
計算量 (-1) (0) r t e ee •
新しい頂点を追加するのにかかる計算量は? • 追加する文字とすでに追加された文字の比較を、 Suffix linkを辿った回数だけ行う • 1文字と1文字の比較はO(1) • そのノードが存在するかの確認 • mapならO(log σ) • 新しい頂点にSuffix linkを追加するために、さらにsuffix linkを辿る • 新しい頂点の深さは最大で、 (前の頂点の深さ) - (辿った回数) + 3 rtr ertre N回の操作後、深さは最大でも3N回しか増えない => 合計の計算量は O(N) * O(log σ)
50.
Appendix https://arxiv.org/abs/1506.04862 • EERTREE: An
Efficient Data Structure for Processing Palindromes in Strings • http://adilet.org/blog/25-09-14/ • Palindromic tree を解説したブログ
Editor's Notes
#3
http://codeforces.com/profile/MikhailRubinchik 無理やり日本語読みすれば、ミハエル ルビンチク? 当時のレートが2279 red相当. Redになってやめた? ICPCにもコーチとしてよく参加している
#4
Manacher algorithmとの違い 空間計算量が増える代わりに出来ることが大量に増えた 時間計算量は一緒
#5
Manacher algorithmとの違い 空間計算量が増える代わりに出来ることが大量に増えた 時間計算量は一緒
#6
Manacher algorithmとの違い 空間計算量が増える代わりに出来ることが大量に増えた 時間計算量は一緒
#17
正確には、頂点の文字列に含まれる中で自身より真に小さい最大の接尾辞回文、なのだが、長いので省略
#18
正確には、頂点の文字列に含まれる中で自身より真に小さい最大の接尾辞回文、なのだが、長いので省略
#19
正確には、頂点の文字列に含まれる中で自身より真に小さい最大の接尾辞回文、なのだが、長いので省略
#20
正確には、頂点の文字列に含まれる中で自身より真に小さい最大の接尾辞回文、なのだが、長いので省略
#31
Suffix linkの張り方は別の例で解説
#43
Manacher algorithmとの違い 空間計算量が増える代わりに出来ることが大量に増えた 時間計算量は一緒
#44
Manacher algorithmとの違い 空間計算量が増える代わりに出来ることが大量に増えた 時間計算量は一緒
#45
Manacher algorithmとの違い 空間計算量が増える代わりに出来ることが大量に増えた 時間計算量は一緒
#46
Manacher algorithmとの違い 空間計算量が増える代わりに出来ることが大量に増えた 時間計算量は一緒
Download