SlideShare a Scribd company logo
1 of 11
Download to read offline
replace




  原案:komiya
解答:fura2, komiya
 スライド:komiya
問題概要
●   文字列Sがある。以下のクエリをQ個処理する。
●   Sについて、文字cを文字列pで置換する。
●   部分文字列S[A..B]を出力する。

●   1 ≦ Q ≦ 3*10^5
●   |S|, |p| ≦ 10
●   1 ≦ A ≦ B ≦ 10^18
●   B – A ≦ 10^5
解法(前半)
●   文字列をグラフ(DAG)っぽく持つようにする。
●   このとき、同じ文字は同じノードを表すようにし
    て、置換を一瞬で処理できるようにしておく。
根
S=abaz


         a   b       z
根
 S=abaz
a → cab

              旧a        b       z




          c        新a
根
 S=abaz
a → cab                        今はどこからも参照
b → (empty)                    されていない
                  旧b       z    新b




          c   a
根
 S=abaz
a → cab
b → (empty)
c→x                     z




           旧c   a




       x
解法(後半)
●   全ての文字列をデータとして保持することは簡
    単だが、その中から10^5文字出力するのは注
    意しないとTLEする可能性がある。
●   グラフをメモ化探索っぽく縦断するけど、長さ0
    の部分を消したり、子ノードと自ノードのサイズ
    が同じ時は適当に経路圧縮するように実装す
    ればよい。
●   スタックオーバーフローにも注意すること。
根 (5)
 S=abaz                                           サイズ0のノードへの
                                                  リンクを消す
a → cab
b → (empty)
                (2)          (0)           z(1)    ()の中はこのDAGを
c→x                                                永続木として解釈した
                                                   ときの部分木に含まれ
                                                   る文字の個数


          (1)         a(1)




       x(1)
根(5)
 S=abaz                                      出字数1のノード
                                             を圧縮する
a → cab
b → (empty)
                (2)          (0)      z(1)
c→x




          (1)         a(1)




       x(1)
根(5)
 S=abaz                                  完成形
a → cab                                  これでn文字分の出力が
b → (empty)                              O(n+Q)でできる
              (2)                 z(1)
c→x
                                         理由:葉以外の出次
                                         数が2以上なので、部
                                         分木のサイズが葉の
                                         個数(出力すべき文字
                                         数)の2倍を越えない
                    a(1)




       x(1)

More Related Content

What's hot

Cf219 d1d
Cf219 d1dCf219 d1d
Cf219 d1dDEGwer
 
Scalable Partial Least Squares Regression on Grammar-Compressed Data Matrices
Scalable Partial Least Squares Regression on Grammar-Compressed Data MatricesScalable Partial Least Squares Regression on Grammar-Compressed Data Matrices
Scalable Partial Least Squares Regression on Grammar-Compressed Data MatricesYasuo Tabei
 
DDPC 2016 予選 解説
DDPC 2016 予選 解説DDPC 2016 予選 解説
DDPC 2016 予選 解説AtCoder Inc.
 
基底変換、固有値・固有ベクトル、そしてその先
基底変換、固有値・固有ベクトル、そしてその先基底変換、固有値・固有ベクトル、そしてその先
基底変換、固有値・固有ベクトル、そしてその先Taketo Sano
 
Sort
SortSort
Sortoupc
 
Alloyによるハミルトン閉路
Alloyによるハミルトン閉路Alloyによるハミルトン閉路
Alloyによるハミルトン閉路Takamasa Saichi
 
Magical
MagicalMagical
Magicaloupc
 
大きい行列の問題
大きい行列の問題大きい行列の問題
大きい行列の問題政孝 鍋島
 
UTPC2012 - K
UTPC2012 - KUTPC2012 - K
UTPC2012 - Komeometo
 
SICP
SICPSICP
SICPS W
 
AtCoder Regular Contest 049 解説
AtCoder Regular Contest 049 解説AtCoder Regular Contest 049 解説
AtCoder Regular Contest 049 解説AtCoder Inc.
 
CODE FESTIVAL 2015 予選B 解説
CODE FESTIVAL 2015 予選B 解説CODE FESTIVAL 2015 予選B 解説
CODE FESTIVAL 2015 予選B 解説AtCoder Inc.
 
AtCoder Regular Contest 048
AtCoder Regular Contest 048AtCoder Regular Contest 048
AtCoder Regular Contest 048AtCoder Inc.
 

What's hot (20)

Cf219 d1d
Cf219 d1dCf219 d1d
Cf219 d1d
 
Scalable Partial Least Squares Regression on Grammar-Compressed Data Matrices
Scalable Partial Least Squares Regression on Grammar-Compressed Data MatricesScalable Partial Least Squares Regression on Grammar-Compressed Data Matrices
Scalable Partial Least Squares Regression on Grammar-Compressed Data Matrices
 
DDPC 2016 予選 解説
DDPC 2016 予選 解説DDPC 2016 予選 解説
DDPC 2016 予選 解説
 
abc032
abc032abc032
abc032
 
ACPC 2018 Day3 F: 01 文字列と窓 (Binary String with Slit)
ACPC 2018 Day3 F: 01 文字列と窓 (Binary String with Slit)ACPC 2018 Day3 F: 01 文字列と窓 (Binary String with Slit)
ACPC 2018 Day3 F: 01 文字列と窓 (Binary String with Slit)
 
基底変換、固有値・固有ベクトル、そしてその先
基底変換、固有値・固有ベクトル、そしてその先基底変換、固有値・固有ベクトル、そしてその先
基底変換、固有値・固有ベクトル、そしてその先
 
Sort
SortSort
Sort
 
Alloyによるハミルトン閉路
Alloyによるハミルトン閉路Alloyによるハミルトン閉路
Alloyによるハミルトン閉路
 
Pyramid
PyramidPyramid
Pyramid
 
Magical
MagicalMagical
Magical
 
大きい行列の問題
大きい行列の問題大きい行列の問題
大きい行列の問題
 
大きい行列の問題
大きい行列の問題大きい行列の問題
大きい行列の問題
 
UTPC2012 - K
UTPC2012 - KUTPC2012 - K
UTPC2012 - K
 
SICP
SICPSICP
SICP
 
5 Info Theory
5 Info Theory5 Info Theory
5 Info Theory
 
AtCoder Regular Contest 049 解説
AtCoder Regular Contest 049 解説AtCoder Regular Contest 049 解説
AtCoder Regular Contest 049 解説
 
PRML_titech 8.1 - 8.2
PRML_titech 8.1 - 8.2PRML_titech 8.1 - 8.2
PRML_titech 8.1 - 8.2
 
CODE FESTIVAL 2015 予選B 解説
CODE FESTIVAL 2015 予選B 解説CODE FESTIVAL 2015 予選B 解説
CODE FESTIVAL 2015 予選B 解説
 
Moon
MoonMoon
Moon
 
AtCoder Regular Contest 048
AtCoder Regular Contest 048AtCoder Regular Contest 048
AtCoder Regular Contest 048
 

Viewers also liked

Paren
ParenParen
Parenoupc
 
Comment
CommentComment
Commentoupc
 
Permutation
PermutationPermutation
Permutationoupc
 
Gcd
GcdGcd
Gcdoupc
 
Sharp2sat
Sharp2satSharp2sat
Sharp2satoupc
 
Rmq
RmqRmq
Rmqoupc
 
Goto
GotoGoto
Gotooupc
 
Kth
KthKth
Kthoupc
 
Segpair
SegpairSegpair
Segpairoupc
 
Palin
PalinPalin
Palinoupc
 
Cube
CubeCube
Cubeoupc
 
One
OneOne
Oneoupc
 
Trip
TripTrip
Tripoupc
 
Sanpo
SanpoSanpo
Sanpooupc
 
指数時間アルゴリズム入門
指数時間アルゴリズム入門指数時間アルゴリズム入門
指数時間アルゴリズム入門Yoichi Iwata
 

Viewers also liked (16)

Paren
ParenParen
Paren
 
Comment
CommentComment
Comment
 
Permutation
PermutationPermutation
Permutation
 
1
11
1
 
Gcd
GcdGcd
Gcd
 
Sharp2sat
Sharp2satSharp2sat
Sharp2sat
 
Rmq
RmqRmq
Rmq
 
Goto
GotoGoto
Goto
 
Kth
KthKth
Kth
 
Segpair
SegpairSegpair
Segpair
 
Palin
PalinPalin
Palin
 
Cube
CubeCube
Cube
 
One
OneOne
One
 
Trip
TripTrip
Trip
 
Sanpo
SanpoSanpo
Sanpo
 
指数時間アルゴリズム入門
指数時間アルゴリズム入門指数時間アルゴリズム入門
指数時間アルゴリズム入門
 

More from oupc

Knapsack
KnapsackKnapsack
Knapsackoupc
 
Game
GameGame
Gameoupc
 
Four op
Four opFour op
Four opoupc
 
Divisor
DivisorDivisor
Divisoroupc
 
Division
DivisionDivision
Divisionoupc
 
Anagram
AnagramAnagram
Anagramoupc
 
Comment
CommentComment
Commentoupc
 

More from oupc (8)

Knapsack
KnapsackKnapsack
Knapsack
 
Game
GameGame
Game
 
Four op
Four opFour op
Four op
 
Divisor
DivisorDivisor
Divisor
 
Division
DivisionDivision
Division
 
Anagram
AnagramAnagram
Anagram
 
A
AA
A
 
Comment
CommentComment
Comment
 

Replace

  • 1. replace 原案:komiya 解答:fura2, komiya スライド:komiya
  • 2. 問題概要 ● 文字列Sがある。以下のクエリをQ個処理する。 ● Sについて、文字cを文字列pで置換する。 ● 部分文字列S[A..B]を出力する。 ● 1 ≦ Q ≦ 3*10^5 ● |S|, |p| ≦ 10 ● 1 ≦ A ≦ B ≦ 10^18 ● B – A ≦ 10^5
  • 3. 解法(前半) ● 文字列をグラフ(DAG)っぽく持つようにする。 ● このとき、同じ文字は同じノードを表すようにし て、置換を一瞬で処理できるようにしておく。
  • 4. 根 S=abaz a b z
  • 5. 根 S=abaz a → cab 旧a b z c 新a
  • 6. 根 S=abaz a → cab 今はどこからも参照 b → (empty) されていない 旧b z 新b c a
  • 7. 根 S=abaz a → cab b → (empty) c→x z 旧c a x
  • 8. 解法(後半) ● 全ての文字列をデータとして保持することは簡 単だが、その中から10^5文字出力するのは注 意しないとTLEする可能性がある。 ● グラフをメモ化探索っぽく縦断するけど、長さ0 の部分を消したり、子ノードと自ノードのサイズ が同じ時は適当に経路圧縮するように実装す ればよい。 ● スタックオーバーフローにも注意すること。
  • 9. 根 (5) S=abaz サイズ0のノードへの リンクを消す a → cab b → (empty) (2) (0) z(1) ()の中はこのDAGを c→x 永続木として解釈した ときの部分木に含まれ る文字の個数 (1) a(1) x(1)
  • 10. 根(5) S=abaz 出字数1のノード を圧縮する a → cab b → (empty) (2) (0) z(1) c→x (1) a(1) x(1)
  • 11. 根(5) S=abaz 完成形 a → cab これでn文字分の出力が b → (empty) O(n+Q)でできる (2) z(1) c→x 理由:葉以外の出次 数が2以上なので、部 分木のサイズが葉の 個数(出力すべき文字 数)の2倍を越えない a(1) x(1)