์ด ๊ธ€์€ KMP ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ Trie ์ž๋ฃŒ๊ตฌ์กฐ์— ๋Œ€ํ•œ ์ดํ•ด๋ฅผ ์„ ํ–‰์œผ๋กœ ์š”๊ตฌํ•ฉ๋‹ˆ๋‹ค.

Motivation

์–ด๋–ค $n$๊ธ€์ž์˜ ๊ธด ํ…์ŠคํŠธ $T$์— ๋Œ€ํ•ด, ์งง์€ $m$๊ธ€์ž์˜ ํŒจํ„ด $P$๋ฅผ ๋งค์นญํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ์ƒ๊ฐํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

  • ๊ฐ€์žฅ Naiveํ•˜๊ฒŒ $T$์˜ ๋ชจ๋“  ์œ„์น˜์— ๋Œ€ํ•ด $m$๊ธ€์ž๋ฅผ ๋งค์นญํ•ด๋ณด๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ $O(nm)$ ์ž…๋‹ˆ๋‹ค.
  • KMP ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์€ (์–ธ์  ๊ฐ€ ์ž‘์„ฑํ•  ๊ณ„ํš์€ ์žˆ์ง€๋งŒ ์šฐ์„ ์ˆœ์œ„๋Š” ๋‚ฎ์Šต๋‹ˆ๋‹ค) ์ด๋ฅผ $O(n + m)$ ์œผ๋กœ ์ค„์ธ ์—„์ฒญ๋‚œ ์„ฑ๊ณผ๋ฅผ ๋ณด์ž…๋‹ˆ๋‹ค.

KMP๊ฐ€ ์ด๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ๋ฐฉ๋ฒ•์€, T[i..i+L-1] ๊ณผ P๋ฅผ ๋งค์นญํ•˜๋‹ค๊ฐ€ ์ค‘๊ฐ„์— ์‹คํŒจํ–ˆ๋‹ค๊ณ  ํ•  ๋•Œ, Naive ๋งค์นญ์€ T[i+1..i+L] ์„ ์‹œ๋„ํ•˜๋ฉด์„œ ์•ž์„œ์˜ ์ •๋ณด๋ฅผ ์ „ํ˜€ ์ด์šฉํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜, ํŒจํ„ด์ด abababa์ธ๋ฐ, ababa๊นŒ์ง€ ๋งž๊ณ  ์—ฌ์„ฏ๋ฒˆ์งธ b๊ฐ€ ํ‹€๋ ธ๋‹ค๋ฉด, ์•ž ๋‹ค์„ฏ๊ธ€์ž๊นŒ์ง€ ๋งž์•˜๋‹ค๋Š” ์ •๋ณด๋ฅผ ์ตœ๋Œ€ํ•œ ์ด์šฉํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์ •๋ง ๊ฐ€๋Šฅํ•œ ์ตœ๋Œ€๋กœ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ด KMP ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋ฉฐ, ์œ„ ์œ„ํ‚คํ”ผ๋””์•„์˜ ๋งํฌ์™€ ํ•จ๊ป˜ BowBowBow๋‹˜์˜ ๋ธ”๋กœ๊ทธ ๊ธ€์„ ์ฐธ๊ณ ํ•˜๋ฉด ๊ทธ๋ ‡๊ฒŒ ์–ด๋ ต์ง€ ์•Š๊ฒŒ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์š”์ ์€, ์•ž ๋ช‡๊ธ€์ž๊ฐ€ ๋งž์•˜์Œ์„ ์ด์šฉํ•ด์„œ ์ ˆ๋Œ€ ๋งž์„๋ฆฌ๊ฐ€ ์—†๋Š” ์œ„์น˜๋“ค์„ ์Šคํ‚ตํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ์‹คํŒจํ•จ์ˆ˜ ๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค.

์ด์ œ, ์ด๋ฅผ ํŒจํ„ด์ด ์—ฌ๋Ÿฌ ๊ฐœ์ธ ๊ฒฝ์šฐ๋กœ ํ™•์žฅํ•˜๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค. ํŒจํ„ด์ด $m_1, m_2, \dots m_k$ ๊ธ€์ž์˜ $P_1, \dots P_k$ ๋ผ๊ณ  ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

Algorithm

์‹คํŒจํ•จ์ˆ˜๋Š” ๊ฒฐ๊ตญ ์–ด๋–ค prefix๊นŒ์ง€๋Š” ๋งž์•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ๋Š” ๋ฐ์„œ ์˜ค๋Š”๋ฐ, ์šฐ๋ฆฌ๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํŒจํ„ด์— ๋Œ€ํ•ด ๋น„์Šทํ•œ ์ •๋ณด๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

Prefix ์—ฌ๋Ÿฌ๊ฐœ๋ฅผ ๋™์‹œ์— ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์€ Trie๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. picture 1

์ด ๊ทธ๋ฆผ์„ ๋ณด๋ฉด, ํŒŒ๋ž€ ๊ฐ„์„ ๊ณผ ํ•จ๊ป˜ ๋นจ๊ฐ„ ๊ฐ„์„ ์ด ๊ทธ๋ ค์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. ํŒŒ๋ž€ ๊ฐ„์„ ์€ ์šฐ๋ฆฌ๊ฐ€ ์ผ๋ฐ˜์ ์œผ๋กœ ์•Œ๊ณ  ์žˆ๋Š” Trie์˜ ๊ฐ„์„ ์ด๊ณ , ๋นจ๊ฐ„ ๊ฐ„์„ ์€ Failure function์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด Failure function์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

โ€œํŒจํ„ด $P$์— ๋Œ€ํ•ด, ๊ทธ prefix $Pโ€™$ ๊นŒ์ง€๋ฅผ ํ˜„์žฌ ๋งค์นญํ–ˆ๋‹ค๊ณ  ํ•˜์ž. ์ด๋•Œ, $Pโ€™$์— ํ•ด๋‹นํ•˜๋Š” ๋…ธ๋“œ์˜ ์‹คํŒจ-๋…ธ๋“œ $f(Pโ€™)$ ์„ ์ฐพ๋Š”๋ฐ, ์ด๋Š” $Pโ€™$์˜ proper suffix์ด๋ฉด์„œ, ๋‹ค๋ฅธ ํŒจํ„ด์˜ prefix ์ธ ๊ฐ€์žฅ ๊นŠ์€ ๋…ธ๋“œ์—ฌ์•ผ ํ•œ๋‹คโ€

์ด ์กฐ๊ฑด์ด ๋ฌด์Šจ ๋œป์ธ์ง€ ์ƒ๊ฐํ•ด๋ณด๋ฉดโ€ฆ

  • $Pโ€™$์„ ๋งค์นญํ•˜๋‹ค๊ฐ€ ์‹คํŒจํ–ˆ๋‹ค๊ณ  ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด์ œ ๋”์ด์ƒ ์ด ํŒจํ„ด์€ ์ง„ํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • ๊ทธ๋Ÿฌ๋ฉด ์ด์ œ, ๋ฌด์Šจ ํŒจํ„ด์„ ๋…ธ๋ฆด์ง€ ๊ฒฐ์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆผ์—์„œ cacba๋ฅผ ํ…์ŠคํŠธ T[i..]์—๋‹ค๊ฐ€ ๋Œ€๊ณ  ๋งค์นญํ•˜๋‹ค๊ฐ€ ์‹คํŒจํ–ˆ๋‹ค๋ฉด ํ˜„์žฌ ์œ„์น˜์—์„œ ๋‹น์žฅ ๋…ธ๋ฆด ์ˆ˜ ์žˆ๋Š” ํŒจํ„ด์€ acba, cba, ba, a ๋“ฑ์œผ๋กœ ์‹œ์ž‘ํ•˜๋Š” ํŒจํ„ด์„ ๋…ธ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ด๋“ค ์ค‘ ์–ด๋–ค ๋‹ค๋ฅธ ํŒจํ„ด์˜ prefix์—ฌ์•ผ ๋…ธ๋ฆฌ๋Š” ๊ฒƒ์ด ์˜๋ฏธ๊ฐ€ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • ์ด๋Ÿฌํ•œ ๋…ธ๋“œ๋“ค์ด ์—ฌ๋Ÿฌ ๊ฐœ ์žˆ๋‹ค๋ฉด, acba ๋…ธ๋“œ์™€ cba ๋…ธ๋“œ ์ค‘์—๋Š” acba ๋…ธ๋“œ๋ฅผ ๋จผ์ € ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด์œ ๋Š”, acbaโ€ฆ ๋ฅผ ๋งค์นญํ•˜๋‹ค๊ฐ€ ์‹คํŒจํ•˜๋ฉด cbaโ€ฆ ํŒจํ„ด์€ ๊ทธ ๋‹ค์Œ์— ๋…ธ๋ ค๋„ ๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
  • ์ฆ‰, ํ…์ŠคํŠธ๋ฅผ ์Šค์บ”ํ•˜๋ฉด์„œ ํŠธ๋ผ์ด๋ฅผ ๋”ฐ๋ผ์„œ ์›€์ง์ด๋‹ค๊ฐ€, ํŠธ๋ผ์ด์—์„œ ๋”์ด์ƒ ๊ฐˆ๊ณณ์ด ์—†์œผ๋ฉด ์ตœ๋Œ€ํ•œ ๋‹ค๋ฅธ ๋์ ์„ ๋…ธ๋ฆด ์ˆ˜ ์žˆ๋Š” ๊ณณ์œผ๋กœ ์ด๋™ํ•ด์„œ ๊ณ„์† ์‹œ๋„ํ•œ๋‹ค๋Š” ์˜๋ฏธ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

ํŠธ๋ผ์ด๋Š” ๋น ๋ฅด๊ฒŒ constructํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ์ด๋Ÿฌํ•œ ์‹คํŒจํ•จ์ˆ˜๋ฅผ ์–ด๋–ป๊ฒŒ ๊ณ„์‚ฐํ• ์ง€๋งŒ ๋”ฐ๋กœ ์ƒ๊ฐํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์‹คํŒจํ•จ์ˆ˜๋Š” BFS๋ฅผ ์ด์šฉํ•˜์—ฌ, depth๊ฐ€ ์–•์€ ๋…ธ๋“œ๋ถ€ํ„ฐ ๊นŠ์€ ๋…ธ๋“œ๋กœ ๊ฑด์„คํ•ฉ๋‹ˆ๋‹ค.

  • ์ง€๊ธˆ ๋…ธ๋“œ $x$๋ฅผ ๋ณด๊ณ  ์žˆ๋‹ค๋ฉด, ์ด $x$๋ณด๋‹ค ๊นŠ์ด๊ฐ€ ์–•์€ ๋…ธ๋“œ ์ค‘ ๋ฐ˜๋“œ์‹œ $f(x)$ ๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. (proper suffix์˜ ๊ธธ์ด๋Š” ์ž๊ธฐ์ž์‹ ๋ณด๋‹ค ์งง์œผ๋ฏ€๋กœ)
  • $x$์˜ ๋ฐ”๋กœ ์œ„ ๋ถ€๋ชจ๋…ธ๋“œ $p(x)$ ์™€, $p(x)$์—์„œ $x$๋กœ ์˜ค๋Š” edge์˜ ์•ŒํŒŒ๋ฒณ (์ฆ‰ $x$์˜ ๋งˆ์ง€๋ง‰ ๊ธ€์ž์— ํ•ด๋‹นํ•˜๋Š” ์•ŒํŒŒ๋ฒณ)์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ c ๋ผ๊ณ  ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
  • ๋˜ํ•œ, ์‹คํŒจํ•จ์ˆ˜๋Š” depth๊ฐ€ ์–•์€ ๋…ธ๋“œ๋ถ€ํ„ฐ ๊ณ„์‚ฐํ–ˆ์œผ๋ฏ€๋กœ $f(p(x))$ ๋„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ $f(p(x))$ ์—์„œ c๋ฅผ ์ด์šฉํ•˜์—ฌ ์ „์ง„ํ•˜๋Š” edge๊ฐ€ ์žˆ๋‹ค๋ฉด, ์ด๋ฅผ ๋”ฐ๋ผ ์ „์ง„ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด, $f(f(p(x)))$ ์—๋‹ค ๋Œ€๊ณ  ์‹œ๋„ํ•˜๊ณ โ€ฆ ๋ฅผ ๋ฐ˜๋ณตํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๋งŒ์•ฝ ํŠธ๋ผ์ด๋ฅผ ๋”ฐ๋ผ๊ฐ€๋‹ค๊ฐ€ ์–ด๋–ค ํŒจํ„ด์˜ ๋์„ ๋งŒ๋‚˜๋ฉด, ๊ทธ ํŒจํ„ด์„ ์ฐพ์•˜๋‹ค๊ณ  reportํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์ฆ‰ ๊ฐ ๋…ธ๋“œ๋Š” ํ˜น์‹œ ๋‚ด๊ฐ€ ์–ด๋–ค ํŒจํ„ด์˜ ๋์€ ์•„๋‹Œ์ง€๋ฅผ ๋ฏธ๋ฆฌ ๊ธฐ์–ตํ•˜๊ณ  ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ •๋ณด๋Š” ์‚ฌ์‹ค Trie์— ๋ฌธ์ž์—ด๋“ค์„ ์ง‘์–ด๋„ฃ์„๋•Œ ๋ฏธ๋ฆฌ ์žก์•„์ค„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ํฌ๊ฒŒ ๋ฌธ์ œ๋  ๊ฒƒ์ด ์—†์Šต๋‹ˆ๋‹ค.

์Šค์บ”์˜ ๊ณผ์ •์„ pseudocode๋กœ ํ‘œํ˜„ํ•ด ๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. picture 2

Complexity

์•ŒํŒŒ๋ฒณ ํฌ๊ธฐ๋ฅผ $q$, ํŒจํ„ด ์ „์ฒด์˜ ๊ธ€์ž์ˆ˜์˜ ์ดํ•ฉ์„ $M$, ํ…์ŠคํŠธ์˜ ๊ธ€์ž์ˆ˜๋ฅผ $n$์ด๋ผ๊ณ  ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด๋•Œ,

  • Pseudocode๋ฅผ ๋ณด๋ฉด ์ž๋ช…ํ•˜๊ฒŒ ์Šค์บ”์€ $O(n)$ ์ธ๊ฒƒ ๊ฐ™์ง€๋งŒ, ์‹ค์ œ๋กœ๋Š” $n$์— next ํ•จ์ˆ˜๊ฐ€ ์†Œ๋ชจํ•˜๋Š” ์‹œ๊ฐ„๋งŒํผ์ด ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค.
  • ํŠธ๋ผ์ด๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๊ตฌํ˜„์— ๋”ฐ๋ผ ๋‹ค๋ฅธ๋ฐ, ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ๊ตฌํ˜„์ธ child pointer array ๋ฐฉ์‹์„ ์“ฐ๋Š” ๊ฒฝ์šฐ $O(qM)$ ์‹œ๊ฐ„์— ํŠธ๋ผ์ด๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ (BFS๋ฅผ ๋Œ๋ ค์•ผ ํ•ด์„œ ์ด๋งŒํผ์ด ์†Œ๋ชจ๋ฉ๋‹ˆ๋‹ค) $O(qM)$ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์†Œ๋น„ํ•ฉ๋‹ˆ๋‹ค.
  • $q$๊ฐ€ ํฌ๋ฉด ์ด๊ฒƒ์ด ๋น„ํšจ์œจ์ ์ผ ์ˆ˜ ์žˆ๋Š”๋ฐ, ํŠธ๋ผ์ด์˜ ๊ฐ ๋…ธ๋“œ์— BBST๊ฐ™์€๊ฑธ ์“ด๋‹ค๊ฑฐ๋‚˜ ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ๋ฅผ ์“ฐ๋ฉด ๋ณต์žก๋„๊ฐ€ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค. ๋Œ€ํ‘œ์ ์œผ๋กœ BBST๋ฅผ ์“ฐ๋ฉด $O(M \log q)$ ์‹œ๊ฐ„์— ํŠธ๋ผ์ด๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๊ณ , $O(M \log q)$ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์†Œ๋น„ํ•˜๋Š” ๋Œ€์‹ , next๊ฐ€ $O(\log q)$ ์‹œ๊ฐ„์ด ๋“ค๊ฒŒ ๋˜๋ฏ€๋กœ ์Šค์บ”์ด $O(n \log q)$ ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ, ์ข…ํ•ฉํ•˜๋ฉด ๊ฐ„๋‹จํ•˜๊ฒŒ๋Š” $O(qM + n)$ ์‹œ๊ฐ„๊ณผ $O(qM)$ ๊ณต๊ฐ„์„ ์ด์šฉํ•˜์—ฌ multiple pattern matching์„ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๊ตฌํ˜„

๊ตฌํ˜„ ๋งํฌ