狠狠撸

狠狠撸Share a Scribd company logo
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)
Ad

Recommended

グラフと闭集合
グラフと闭集合
政孝 鍋島
?
骋笔鲍による多倍长整数乗算の高速化手法の提案とその评価
骋笔鲍による多倍长整数乗算の高速化手法の提案とその评価
Koji Kitano
?
骋笔鲍による多倍长整数乗算の高速化手法の提案
骋笔鲍による多倍长整数乗算の高速化手法の提案
Koji Kitano
?
AtCoder Regular Contest 045 解説
AtCoder Regular Contest 045 解説
AtCoder Inc.
?
CODE FESTIVAL 2014 エキシビジョン 解説
CODE FESTIVAL 2014 エキシビジョン 解説
AtCoder Inc.
?
AtCoder Beginner Contest 014 解説
AtCoder Beginner Contest 014 解説
AtCoder Inc.
?
Cf219 d1d
Cf219 d1d
DEGwer
?
Scalable Partial Least Squares Regression on Grammar-Compressed Data Matrices
Scalable Partial Least Squares Regression on Grammar-Compressed Data Matrices
Yasuo Tabei
?
DDPC 2016 予選 解説
DDPC 2016 予選 解説
AtCoder Inc.
?
abc032
abc032
AtCoder Inc.
?
ACPC 2018 Day3 F: 01 文字列と窓 (Binary String with Slit)
ACPC 2018 Day3 F: 01 文字列と窓 (Binary String with Slit)
HCPC: 北海道大学競技プログラミングサークル
?
础濒濒辞测によるハミルトン闭路
础濒濒辞测によるハミルトン闭路
Takamasa Saichi
?
Magical
Magical
oupc
?
大きい行列の问题
大きい行列の问题
政孝 鍋島
?
大きい行列の问题
大きい行列の问题
nabeshimamasataka
?
SICP
SICP
S W
?
AtCoder Regular Contest 049 解説
AtCoder Regular Contest 049 解説
AtCoder Inc.
?
PRML_titech 8.1 - 8.2
PRML_titech 8.1 - 8.2
Takafumi Sakakibara
?
CODE FESTIVAL 2015 予選B 解説
CODE FESTIVAL 2015 予選B 解説
AtCoder Inc.
?
Moon
Moon
Ken Ogura
?
AtCoder Regular Contest 048
AtCoder Regular Contest 048
AtCoder Inc.
?
Paren
Paren
oupc
?
Comment
Comment
oupc
?
Permutation
Permutation
oupc
?

More Related Content

What's hot (19)

Cf219 d1d
Cf219 d1d
DEGwer
?
Scalable Partial Least Squares Regression on Grammar-Compressed Data Matrices
Scalable Partial Least Squares Regression on Grammar-Compressed Data Matrices
Yasuo Tabei
?
DDPC 2016 予選 解説
DDPC 2016 予選 解説
AtCoder Inc.
?
abc032
abc032
AtCoder Inc.
?
ACPC 2018 Day3 F: 01 文字列と窓 (Binary String with Slit)
ACPC 2018 Day3 F: 01 文字列と窓 (Binary String with Slit)
HCPC: 北海道大学競技プログラミングサークル
?
础濒濒辞测によるハミルトン闭路
础濒濒辞测によるハミルトン闭路
Takamasa Saichi
?
Magical
Magical
oupc
?
大きい行列の问题
大きい行列の问题
政孝 鍋島
?
大きい行列の问题
大きい行列の问题
nabeshimamasataka
?
SICP
SICP
S W
?
AtCoder Regular Contest 049 解説
AtCoder Regular Contest 049 解説
AtCoder Inc.
?
PRML_titech 8.1 - 8.2
PRML_titech 8.1 - 8.2
Takafumi Sakakibara
?
CODE FESTIVAL 2015 予選B 解説
CODE FESTIVAL 2015 予選B 解説
AtCoder Inc.
?
Moon
Moon
Ken Ogura
?
AtCoder Regular Contest 048
AtCoder Regular Contest 048
AtCoder Inc.
?

Viewers also liked (16)

Paren
Paren
oupc
?
Comment
Comment
oupc
?
Permutation
Permutation
oupc
?
Sharp2sat
Sharp2sat
oupc
?
Segpair
Segpair
oupc
?
Palin
Palin
oupc
?
Sanpo
Sanpo
oupc
?
指数时间アルゴリズム入门
指数时间アルゴリズム入门
Yoichi Iwata
?
Paren
Paren
oupc
?
Comment
Comment
oupc
?
Permutation
Permutation
oupc
?
Sharp2sat
Sharp2sat
oupc
?
Segpair
Segpair
oupc
?
Palin
Palin
oupc
?
Sanpo
Sanpo
oupc
?
指数时间アルゴリズム入门
指数时间アルゴリズム入门
Yoichi Iwata
?
Ad

More from oupc (8)

Knapsack
Knapsack
oupc
?
Four op
Four op
oupc
?
Divisor
Divisor
oupc
?
Division
Division
oupc
?
Anagram
Anagram
oupc
?
Comment
Comment
oupc
?
Knapsack
Knapsack
oupc
?
Four op
Four op
oupc
?
Divisor
Divisor
oupc
?
Division
Division
oupc
?
Anagram
Anagram
oupc
?
Comment
Comment
oupc
?
Ad

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)