ãŸããããªããããäžäœãªã®ãããšãã質åãé¿ããããšæããŸãã ãã¹ãŠããã§ã«æžãããŠããŸããã ã¯ããæžãããŠããŸãã ãããã第äžã«ã䜿çšããããŒã«ããã®å¶éãããããç解ããããã«äžäœã¬ãã«ã§ã©ã®ããã«æ©èœããããç¥ãããšã¯æçšã§ãã第äºã«ãããã¯ã¹ããæ©èœããstrstrïŒïŒé¢æ°ãååã§ãªãé£æ¥é åãååã«å€§ããã§ãã 第äžã«ãéãæªããã¢ãã€ã«ãã©ãããã©ãŒã çšã®ã©ã³ã¿ã€ã ãéçºããå¿ èŠãããå ŽåããããŸãããããèªåã§è£è¶³ããå Žåã¯ã賌èªããŠãããã®ãç¥ãæ¹ãè¯ãã§ãããïŒãããç空äžã®çç¶ã®åé¡ã§ã¯ãªãããšã確èªããã«ã¯ãwcslenãè©ŠããŠãã ããïŒ Android NDKã®wcsstrïŒïŒïŒã
ããããæ€çŽ¢ããããšã¯æ¬åœã«äžå¯èœã§ããïŒ
äºå®ã¯ããã¹ãŠãããã€ã¯ã¢ã³ããµãŒãããšããŠå®åŒåããæçœãªæ¹æ³ã決ããŠæãå¹æçã§ã¯ãªãããšã§ããããã®ãããªäœã¬ãã«ã§æ¯èŒçé »ç¹ã«åŒã³åºãããæ©èœã«ãšã£ãŠãããã¯éèŠã§ãã ãããã£ãŠãèšç»ã¯æ¬¡ã®ãšããã§ãã
- åé¡ã®èª¬æïŒå®çŸ©ãšèŠåãããã«ãªã¹ãããŸãã
- ãé¡ã«ãã®æ±ºå®ïŒããã§ã¯ããããããªãæ¹æ³ãšçç±ã説æããŸãã
- Zé¢æ°ïŒéšåæååæ€çŽ¢ã®æ£ããå®è£ ã®æãåçŽãªããŒãžã§ã³ã
- Knuth-Morris-Prattã¢ã«ãŽãªãºã ïŒå¥ã®æ£ããæ€çŽ¢ãªãã·ã§ã³ã
- ãã®ä»ã®æ€çŽ¢ã¿ã¹ã¯ïŒè©³çŽ°ãªèª¬æãªãã§ç°¡åã«èª¿ã¹ãŸãã
åé¡ã®å£°æ
åé¡ã®æšæºããŒãžã§ã³ã¯æ¬¡ã®ããã«ãªããŸãïŒè¡A ïŒ text ïŒããããŸãã ãµãã¹ããªã³ã°X ïŒ ãã¿ãŒã³ ïŒãå«ãŸããŠãããã©ããã確èªããå¿ èŠããããŸããããå Žåã¯ãã©ãããéå§ãããã確èªããŸãã ããã¯ãCã§strstrïŒïŒé¢æ°ãè¡ãããšãšãŸã£ããåãã§ããããã«å ããŠããã¿ãŒã³ã®ãã¹ãŠã®åºçŸãæ€çŽ¢ããããã«äŸé Œããããšãã§ããŸãã æããã«ã Xã Aããé·ããªãå Žåã«ã®ã¿ãã¿ã¹ã¯ã¯æå³ããªããŸãã
詳现ãªèª¬æãç°¡åã«ãããããäžåºŠã«ããã€ãã®æŠå¿µã玹ä»ããŸãã æååãšã¯ã誰ããããããç解ããŠãã-ããã¯æååã§ããã空ã®å ŽåããããŸãã èšå· ããŸãã¯æåã¯ã ã¢ã«ãã¡ããããšåŒã°ããç¹å®ã®ã»ããã«å±ããŸã ïŒãã®ã¢ã«ãã¡ãããã¯ãäžè¬çã«èšãã°ãåžžèçã«ã¯ã¢ã«ãã¡ããããšã¯ç¡é¢ä¿ãããããŸããïŒã ã¹ããªã³ã°ã®é·ã | A | -ããã¯æããã«ãã®äžã®æåæ°ã§ãã ã¹ããªã³ã° A [ ..i ] ã®ãã¬ãã£ãã¯ã¹ã¯ãã¹ããªã³ã° Aã®æåã®iæåã®ã¹ããªã³ã°ã§ãã ã¹ããªã³ã° A [ j .. ] ã®ãµãã£ãã¯ã¹ã¯ ã|ã®ã¹ããªã³ã°ã§ãã A | -j +æåŸã®1æåã Aã®éšåæååã¯A [ i..j ]ãšããŠç€ºããã A [ i ]ã¯æååã®içªç®ã®æåã§ãã 空ã®æ¥å°ŸèŸãæ¥é èŸãªã©ã«é¢ãã質å 觊ããªãã§ãã ãã-ããŒã«ã«ã§å¯ŸåŠããããšã¯é£ãããããŸããã ã»ã³ããã«ã®ãããªãã®ããŸã ãããŸã-ã¢ã«ãã¡ãããã«ã¯èŠãããªããŠããŒã¯ãªã·ã³ãã«ã§ãã $èšå·ã§ç€ºããããã®ãããªèšå·ã®ä»ããæå¹ãªã¢ã«ãã¡ãããã§è£å®ãããŸãïŒçè«çã«ã¯ãå®éã«ã¯ãå ¥åè¡ã«è¡šç€ºãããªãèšå·ãèŠã€ããããããè¿œå ã®ãã§ãã¯ãé©çšããæ¹ãç°¡åã§ãïŒã
èšç®ã§ã¯ãæååã®æåã®äœçœ®ããæåãèæ ®ããŸãã ã³ãŒããæžãã®ã¯äŒçµ±çã«ãŒãããæ°ããããšã§ç°¡åã§ãã ãããã®ããå¥ã®ãã®ãžã®ç§»è¡ã¯é£ãããããŸããã
é¡ãœãªã¥ãŒã·ã§ã³
çŽæ¥æ€çŽ¢ããŸãã¯ããèšããããéžæããŠæ€çŽ¢ãããã¯ãçµéšã®æµ ãããã°ã©ããŒã®é ã«æµ®ãã¶æåã®ãœãªã¥ãŒã·ã§ã³ã§ãã æ¬è³ªã¯ç°¡åã§ãããã§ãã¯ããæååAã«æ²¿ã£ãŠé²ã¿ããã®äžã®ç®çã®æååXã®æåã®æåã®åºçŸãæ¢ããŸãã èŠã€ãã£ããããããåãæãŸãããšã³ããªã§ãããšãã仮説ãç«ãŠãŸãã 次ã«ããã³ãã¬ãŒãã®åŸç¶ã®ãã¹ãŠã®æåãé çªã«ãã§ãã¯ããŠãè¡Aã®å¯Ÿå¿ããæåãšäžèŽãããã©ããã確èªããŸãã ãããããã¹ãŠäžèŽããå ŽåãããããŸãã«ç®ã®åã§ãã ããããæåã®1ã€ãäžèŽããªãå Žåã仮説ãfalseãšããŠèªèãã以å€ã«äœãæ®ããŸãããããã«ããã Xããã®æåã®æåã®åºçŸã«ç¶ãæåã«æ»ããŸãã
å€ãã®äººã ã¯ãã®æç¹ã§ééããŠããŸããæ»ãå¿ èŠã¯ãªããšä¿¡ããŠããŸãããçŸåšã®äœçœ®ããè¡Aã®åŠçãç¶ããããšãã§ããŸãã A = â AAAABâã®æ€çŽ¢X = â AAABâã®äŸã§ç€ºãã®ãããã»ã©ç°¡åã§ã¯ãªãçç±ã æåã®ä»®èª¬ã¯ã4çªç®ã®æåA ïŒ "AAAAB"ã«ã€ãªãã ãããã§ãã¹ããããèŠã€ãããŸãã ããŒã«ããã¯ããªãå Žåããšã³ããªã¯ååšããŸãããèŠã€ãããŸããã
ééã£ã仮説ã¯é¿ããããŸãããæªãç¶æ³äžã§ã®ãã®ãããªããŒã«ããã¯ã®ããã Aã®åæåã| X | åã ã€ãŸããèšç®ã®è€éãã¯ã¢ã«ãŽãªãºã OïŒ| X || A |ïŒã®è€éãã§ãã ãããã£ãŠã段èœå ã®ãã¬ãŒãºã®æ€çŽ¢ã¯ãã©ãã°ã¢ãŠãã§ããŸã...
å ¬å¹³ã«èšããšãè¡ãå°ããå Žåããã®ãããªã¢ã«ãŽãªãºã ã¯ãããã»ããµã®èŠ³ç¹ããäºæž¬å¯èœãªåäœã«ããããæ£ãããã¢ã«ãŽãªãºã ãããéãåäœããããšã«æ³šæããå¿ èŠããããŸãã
Zé¢æ°
æååãæ€çŽ¢ããæ£ããæ¹æ³ã®ã«ããŽãªã®1ã€ã¯ãããæå³ã§2ã€ã®æååã®çžé¢ãèšç®ããããšã§ãã ãŸãã2è¡ã®å é ãæ¯èŒããã¿ã¹ã¯ã¯åçŽã§ç°¡åã§ããããšã«æ³šæããŠãã ãããççŸãèŠã€ããããè¡ã®ãããããçµãããŸã§ã察å¿ããæåãæ¯èŒããŸãã ã¹ããªã³ã°Aã®ãã¹ãŠã®æ¥å°Ÿéšã®ã»ãããæ€èšããŠãã ããã A | .. ] A [ | A | -1 .. ] ã... A [ 1 .. ] ã è¡ã®å é èªäœãšãã®æ¥å°ŸèŸã®ãããããæ¯èŒããŸãã æ¯èŒã¯ãæ¥å°ŸèŸã®æåŸã«éããããäžäžèŽã®ããã«äžéšã®èšå·ã§éåããããšããããŸãã äžèŽããéšåã®é·ãã¯ãç¹å®ã®æ¥å°ŸèŸã®Zé¢æ°ã®ã³ã³ããŒãã³ããšåŒã°ããŸãã
ã€ãŸããZé¢æ°ã¯ãæååã®æ倧ã®å ±éãã¬ãã£ãã¯ã¹ãšãã®ãµãã£ãã¯ã¹ã®é·ããã¯ãã«ã§ãã ãã㌠誰ããæ··åããã䞻匵ãããããå¿ èŠãããå Žåã«ã¯çŽ æŽããããã¬ãŒãºã§ããããããäœã§ããããç解ããã«ã¯ãäŸãèããæ¹ãè¯ãã§ãããã
å ã®æååã¯"ababcaba"ã§ãã åæ¥å°ŸèŸãæååèªäœãšæ¯èŒãããšãZé¢æ°ã®ãã¬ãŒããåŸãããŸãã
æ¥å°ŸèŸ | ã²ã | Z | |
---|---|---|---|
ã¢ããã«ã | ã¢ããã«ã | -> | 8 |
ããã«ã | ã¢ããã«ã | -> | 0 |
ã¢ãã«ã | ã¢ããã«ã | -> | 2 |
bcaba | ã¢ããã«ã | -> | 0 |
ã«ã | ã¢ããã«ã | -> | 0 |
ãã° | ã¢ããã«ã | -> | 3 |
ba | ã¢ããã«ã | -> | 0 |
a | ã¢ããã«ã | -> | 1 |
æ¥å°ŸèŸã®æ¥é èŸã¯éšåæååã«ããããZé¢æ°ã¯å é ãšäžå€®ã§åæã«çºçããéšåæååã®é·ãã§ãã Zé¢æ°ã®ã³ã³ããŒãã³ãã®ãã¹ãŠã®å€ãèæ ®ãããšãããã€ãã®èŠåæ§ã«æ°ä»ãããšãã§ããŸãã ãŸããZé¢æ°ã®å€ãæååã®é·ããè¶ ããããå®å šãªãæ¥å°ŸèŸA [ 1 .. ]ã«ã€ããŠã®ã¿äžèŽããããšã¯æããã§ãïŒãããã£ãŠããã®å€ã¯ç§ãã¡ã®èå³ãåŒããã®ã§ã¯ãããŸãããæšè«ã§ã¯çç¥ããŸãïŒã 第äºã«ãåäžã®ã³ããŒã®æååã«åäžã®æåãããå Žåãããã¯ããèªäœãšäžèŽããã ãã§ãããããæååã2ã€ã®éšåã«åå²ããZé¢æ°ã®å€ã¯çãéšåã®é·ããè¶ ããããšã¯ã§ããŸããã
ãããã®èŠ³å¯çµæã®äœ¿çšã¯ã次ã®ããã«ææ¡ãããŠããŸãã ãababcabacabãã®è¡ã§ãabcaããæ€çŽ¢ãããšããŸãã ãããã®è¡ãåãããããã®éã«ã»ã³ããã«ãæ¿å ¥ããŠé£çµããŸãïŒ "abca $ababcabacab" ã ãã®ãããªè¡ã§ã¯ãZé¢æ°ã®ãã¯ãã«ã¯æ¬¡ã®ããã«ãªããŸãã
a b c a $ a a b a b c a b with a c a b |
17 0 0 1 0 2 0 4 0 0 4 0 0 1 0 2 0 |
å®å šãªãµãã£ãã¯ã¹ã®å€ãç Žæ£ããå Žåãã»ã³ããã«ã®ååšã«ãããZ iãç®çã®ãã©ã°ã¡ã³ãã®é·ãã«å¶éãããŸãïŒåé¡ã®æå³ã§ã¯è¡ã®ååæªæºã§ãïŒã ãããããã®æ倧å€ã«éãããšãéšåæååã®åºçŸäœçœ®ã®ã¿ã§çºçããŸãã ãã®äŸã§ã¯ã4ã§ç®çã®è¡ã®ãã¹ãŠã®çºçäœçœ®ãããŒã¯ããŸã ïŒèŠã€ãã£ãã»ã¯ã·ã§ã³ã¯äºãã«ãªãŒããŒã©ããããŸãããæšè«ã¯ãã¹ãŠåãã§ããããšã«æ³šæããŠãã ããïŒã
ã€ãŸããZé¢æ°ã®ãã¯ãã«ããã°ããäœæããããã䜿çšããŠæååã®ãã¹ãŠã®åºçŸç®æãæ€çŽ¢ã§ããã°ããã®é·ããèŠã€ããããšã«ãªããŸãã ããããåãµãã£ãã¯ã¹ã®Zé¢æ°ãèšç®ããå Žåã«ã®ã¿ãããã¯æããã«ãæ£é¢ãã®ãœãªã¥ãŒã·ã§ã³ãããé«éã§ã¯ãããŸããã ãã¯ãã«ã®æ¬¡ã®èŠçŽ ã®å€ã¯ãåã®èŠçŽ ã«åºã¥ããŠèŠã€ããããšãã§ããŸãã
äœããã®æ¹æ³ã§ã察å¿ããi-1çªç®ã®æåãŸã§Zé¢æ°ã®å€ãèšç®ãããšããŸãã Z rããã§ã«ç¥ã£ãŠããç¹å®ã®äœçœ®r <iãèããŸãã
ãããã£ãŠããã®äœçœ®ããã®Z ræåã¯ãè¡ã®å é ãšãŸã£ããåãã§ãã ãããã¯ãããããZãããã¯ã圢æããŸãã å³ç«¯ã®Zãããã¯ãã€ãŸããæãé ãZãããã¯ïŒæåã®ãããã¯ã¯ã«ãŠã³ããããŸããïŒã«èå³ããããŸãã å Žåã«ãã£ãŠã¯ãå³ç«¯ã®ãããã¯ã®é·ãããŒãã«ããããšãã§ããŸãïŒç©ºã§ãªããããã¯ãi-1ãã«ããŒããªãå ŽåãZ i-1 = 0ã§ãã£ãŠãi-1stãå³ç«¯ã«ãªããŸãïŒã

ãã®Zãããã¯å ã®åŸç¶ã®æåãèæ ®ãããšããã®ãµãã£ãã¯ã¹ã®äžéšããã§ã«è¡ã®å é ã«ãããããåŠçãããŠãããããæåãã次ã®ãµãã£ãã¯ã¹ãæ¯èŒããããšã¯æå³ããããŸããã Zãããã¯ã®æåŸãŸã§æåãããã«ã¹ãããã§ããŸãã


ã€ãŸããZ rãããã¯ã«ããiçªç®ã®æåãã€ãŸããäœçœ®k = i-r + 1ã®è¡ã®å é ã«ãã察å¿ããæåãèæ ®ãããšã é¢æ°Z kã¯ãã§ã«ããã£ãŠããŸãã Zãããã¯ã®æåŸãŸã§ã®è·é¢Z r- ïŒirïŒããå°ããå Žåããã®ã·ã³ãã«ã®äžèŽé åå šäœãrçªç®ã®Zãããã¯å ã«ããããšãããã«ç¢ºèªã§ããŸããã€ãŸããçµæã¯æ¬¡ã®ããã«ãªããŸããè¡ã®å é ïŒZ i = Z k Z k > = Z r- ïŒirïŒã®å ŽåãZ iãZ r- ïŒirïŒä»¥äžã§ãã ãããã©ãã ãããããç¥ãã«ã¯ãZãããã¯ã«ç¶ãæåããã§ãã¯ããå¿ èŠããããŸãã ããã«ããããã®æåã®hãè¡ã®å é ã®å¯Ÿå¿ããæåãšäžèŽããå ŽåãZ iã¯hãã€å¢å ããŸããZi = Z k + hã ãã®çµæãæ°ããå³ç«¯ã®Zãããã¯ãããå ŽåããããŸãïŒh> 0ã®å ŽåïŒã

ãããã£ãŠãå³ç«¯ã®Zãããã¯ã®å³åŽã§ã·ã³ãã«ãæ¯èŒããã ãã§ãããæ¯èŒãæåããããããããã¯ã¯å³åŽã«ã移åããã倱æãããããã¯ã¯ãã®äœçœ®ã®èšç®ãçµäºããããšãå ±åããŸãã ããã«ãããæååã®é·ãã«æ²¿ã£ãŠç·åœ¢æéã§Zé¢æ°ã®ãã¯ãã«å šäœãæ§ç¯ã§ããŸãã
ãã®ã¢ã«ãŽãªãºã ãé©çšããŠéšåæååãæ€çŽ¢ãããšãæéã®è€éãOïŒ| A | + | X |ïŒãåŸãããŸããããã¯ãæåã®ããŒãžã§ã³ã®è£œåãããã¯ããã«åªããŠããŸãã 確ãã«ãZé¢æ°ã®ãã¯ãã«ãä¿åããå¿ èŠããããŸãããããã¯ãOïŒ| A | + | X |ïŒã®è¿œå ã¡ã¢ãªãå¿ èŠãšããŸãã å®éããã¹ãŠã®ãªã«ã¬ã³ã¹ãæ€çŽ¢ããå¿ èŠã¯ãªããã1ã€ã ãã§ååãªå ŽåãZãããã¯ã®é·ãã||ãã倧ããããããšã¯ã§ããªããããOïŒ| X |ïŒã¡ã¢ãªãŒãçãããšãã§ããŸãã X |ãããã«ãæåã®çºçãæ€åºããåŸãè¡ã®åŠçãç¶è¡ã§ããŸããã
æåŸã«ãZé¢æ°ãèšç®ããé¢æ°ã®äŸã ããªãã¯ã®ãªãã¢ãã«ããŒãžã§ã³ã§ãã
void z_preprocess(vector<int> & Z, const string & str) { const size_t len = str.size(); Z.clear(); Z.resize(len); if (0 == len) return; Z[0] = len; for (size_t curr = 1, left = 0, right = 1; curr < len; ++curr) { if (curr >= right) { size_t off = 0; while ( curr + off < len && str[curr + off] == str[off] ) ++off; Z[curr] = off; right = curr + Z[curr]; left = curr; } else { const size_t equiv = curr - left; if (Z[equiv] < right - curr) Z[curr] = Z[equiv]; else { size_t off = 0; while ( right + off < len && str[right - curr + off] == str[right + off] ) ++off; Z[curr] = right - curr + off; right += off; left = curr; } } } }
void z_preprocess(vector<int> & Z, const string & str) { const size_t len = str.size(); Z.clear(); Z.resize(len); if (0 == len) return; Z[0] = len; for (size_t curr = 1, left = 0, right = 1; curr < len; ++curr) { if (curr >= right) { size_t off = 0; while ( curr + off < len && str[curr + off] == str[off] ) ++off; Z[curr] = off; right = curr + Z[curr]; left = curr; } else { const size_t equiv = curr - left; if (Z[equiv] < right - curr) Z[curr] = Z[equiv]; else { size_t off = 0; while ( right + off < len && str[right - curr + off] == str[right + off] ) ++off; Z[curr] = right - curr + off; right += off; left = curr; } } } }
Knuth-Morris-Prattã¢ã«ãŽãªãºã ïŒKMPïŒ
åã®æ¹æ³ã®è«ççãªåçŽãã«ãããããããå¥ã®ã¢ã«ãŽãªãºã ãããäžè¬çã§ãããããæå³ã§ã¯Zé¢æ°ã®éã§ã-Knut-Morris-Pratt ïŒKMPïŒ ã¢ã«ãŽãªãºã ã æ¥é èŸé¢æ°ã®æŠå¿µã玹ä»ããŸã ã içªç®ã®äœçœ®ã®æ¥é èŸé¢æ°ã¯ãiããçããé·ãiã®æ¥é èŸã®æ¥å°ŸèŸãšäžèŽããæ倧è¡æ¥é èŸã®é·ãã§ãã Zé¢æ°ã®å®çŸ©ã察æŠçžæãå®å šã«ç¡å¹ã«ããªãã£ãå Žåããã®ã³ã³ãã§ééããªããã®å Žæã«é 眮ã§ããŸã:)ãããŠã人éã®èšèªã§ã¯æ¬¡ã®ããã«ãªããŸãïŒèãããããã¹ãŠã®è¡æ¥é èŸãååŸããæ¥é èŸã®æ«å°Ÿãšã®æé·éå§äžèŽã調ã¹ãŸãïŒäºçŽ°ãªå¶ç¶ã®äžèŽã¯èæ ®ããŸããïŒç§èªèº«ãšïŒã ãababcabaãã®äŸã次ã«ç€ºããŸãã
ãã¬ãã£ãã¯ã¹ | ãã¬ãã£ãã¯ã¹ | p |
---|---|---|
a | a | 0 |
ab | ab | 0 |
ab a | åŠå£« | 1 |
ab ab | ab ab | 2 |
ababc | ababc | 0 |
ababc a | ããã« | 1 |
ababc ab | ã¢ããã£ã | 2 |
ababc aba | ã¢ãã»ãã«ã | 3 |
ç¹°ãè¿ããŸããããã¬ãã£ãã¯ã¹é¢æ°ã®å€ãã®ããããã£ã芳å¯ããŸãã æåã«ãå€ã¯ãå®çŸ©ããçŽæ¥åŸãããçªå·ã«ãã£ãŠäžã«å¶éãããŸã-ãã¬ãã£ãã¯ã¹ã®é·ãã¯ããã¬ãã£ãã¯ã¹é¢æ°ããã倧ãããªããã°ãªããŸããã 第äºã«ãåæ§ã«äžæã®æåã¯æååã2ã€ã®éšåã«åå²ãããã¬ãã£ãã¯ã¹é¢æ°ã®æ倧å€ãå°ããæ¹ã®éšåã®é·ãã«å¶éããŸã-é·ããã®ã¯ãã¹ãŠãä»ã®ãã®ãšçãããªãäžæã®æåãå«ãããã§ãã
ãããããèå³ã®ããçµè«ãåŸãããŸãã ãã®çè«çäžéã®ããèŠçŽ ã§éæãããšä»®å®ããŸãã ããã¯ãæåã®éšåãæåŸã®éšåãšäžèŽãããã®ãã¡ã®1ã€ããå®å šãªãååãè¡šãããã®ãããªãã¬ãã£ãã¯ã¹ãããã§çµäºããããšãæå³ããŸãã æ¥é èŸã§ã¯ãååãå®å šã«åã«ããå¿ èŠãããããšã¯æããã§ããã€ãŸãããã®ä»®å®ã§ã¯çãååã«ãªãã¯ãã§ãããé·ãååã§ã¯æ倧ã«ãªããŸãã
ãããã£ãŠãåã®éšåã®ããã«ãç®çã®è¡ãšã»ã³ããã«ã調ã¹ãŠããè¡ãé£çµãããšããã¬ãã£ãã¯ã¹é¢æ°ã®ã³ã³ããŒãã³ãå ã®ç®çã®éšåæååã®é·ãã®ãšã³ããªãã€ã³ãã¯ããšã³ããªãçµäºããå Žæã«å¯Ÿå¿ããŸãã ããšãã°ã ãababcabcacabãã®è¡ã§ãabcaããæ¢ããŸãã ãabca $ ababcabcacabãã®é£çµããŒãžã§ã³ã ãã¬ãã£ãã¯ã¹é¢æ°ã¯æ¬¡ã®ããã«ãªããŸãã
a b c a $ a a b a b c a b with a c a b |
0 0 0 1 0 1 2 1 2 3 4 2 3 4 0 1 2 |
ç¹°ãè¿ããŸãããéšåæååã®ãã¹ãŠã®åºçŸãäžæ°ã«èŠã€ãããŸãã-ãããã¯4ã§çµãããŸãã ãã®ãã¬ãã£ãã¯ã¹é¢æ°ãå¹ççã«èšç®ããæ¹æ³ãç解ããå¿ èŠããããŸãã ã¢ã«ãŽãªãºã ã®èãæ¹ã¯ãZé¢æ°ãæ§ç¯ããèãæ¹ãšã¯å°ãç°ãªããŸãã

ãã¬ãã£ãã¯ã¹é¢æ°ã®æåã®å€ã¯æããã«0ã§ããiçªç®ã®äœçœ®ãŸã§ã®ãã¬ãã£ãã¯ã¹é¢æ°ãã«ãŠã³ãããŸãã i + 1çªç®ã®æåãæ€èšããŠãã ããã içªç®ã®äœçœ®ã®æ¥é èŸé¢æ°ã®å€ãPiã®å Žåãæ¥é èŸA [ .. Pi ]ã¯éšåæååA [ iP i + 1..i ]ãšäžèŽããŸãã ã·ã³ãã«A [ P i +1 ]ãA [ i + 1 ]ãšäžèŽããå ŽåãP i + 1 = P i +1ãšå®å šã«æžãããšãã§ããŸãã ããããããã§ãªãå Žåãå€ã¯ããããå°ãããŠãåãã§ãããŸããŸããã ãã¡ãããPi = 0ã®å ŽåãããŸãæžå°ããå Žæã¯ãªãããããã®å Žåã¯Pi + 1 = 0ã§ãã P i > 0ãšä»®å®ããŸãã 次ã«ãæååã«æ¥é èŸA [ ..P i ]ããããŸããããã¯ãéšåæååA [ iP i + 1..i ]ãšåçã§ãã å¿ èŠãªãã¬ãã£ãã¯ã¹æ©èœã¯ããããã®åçã®ã»ã¯ã·ã§ã³ãšåŠçãããæåå ã§åœ¢æãããŸããã€ãŸãããã¬ãã£ãã¯ã¹ã®åŸã®è¡å šäœãå¿ããŠããã®ãã¬ãã£ãã¯ã¹ãši + 1çªç®ã®æåã ããæ®ãããšãã§ããŸããç¶æ³ã¯åãã§ãã

ãã®ã¹ãããã§ã®ã¿ã¹ã¯ã¯ãäžéãåãåãããè¡ã®åé¡ã«çž®å°ãããŸããïŒ A [ ..P i ] A [ i + 1 ] ãããã¯åãæ¹æ³ã§ååž°çã«è§£æ±ºã§ããŸãïŒãã ããæ«å°Ÿååž°ã¯ãŸã£ããååž°ã§ã¯ãªããã«ãŒãã§ãïŒã ã€ãŸãã A [ P P i +1 ]ãA [ i + 1 ]ã«äžèŽããå ŽåãP i + 1 = P P i +1ã«ãªããŸãã äžèŽããã0ã«ãªããŸã§ããã®æé ãç¹°ãè¿ããŸãã

ãããã®æäœãç¹°ãè¿ããšèŠåã衚瀺ãããŸãããã¹ãããã2ã€ã®ãµã€ã¯ã«ãçºçããŠããããã§ãã ããããããã¯ããã§ã¯ãããŸããã å®éãé·ãkã®ãã¹ããããã«ãŒãã¯ãi + 1çªç®ã®äœçœ®ã®ãã¬ãã£ãã¯ã¹é¢æ°ãå°ãªããšãk-1åæžãããã¬ãã£ãã¯ã¹é¢æ°ããã®ãããªå€ã«å¢ããã«ã¯ãå°ãªããšãk-1å以äžæåããå¿ èŠããããŸãk-1æåãåŠçããŠæåãäžèŽãããŸãã ã€ãŸãããµã€ã¯ã«ã®é·ãã¯ãã®ãããªãµã€ã¯ã«ã®å®è¡ééã«å¯Ÿå¿ãããããã¢ã«ãŽãªãºã ã®è€éãã¯åŠçãããæååã®é·ãã«æ²¿ã£ãŠç·åœ¢ã«ãªããŸãã ããã§ã®ç¶æ³ã¯ãã¡ã¢ãªã®å ŽåãšZé¢æ°ã®å Žåãšåãã§ã-ç·ã®é·ãã«æ²¿ã£ãŠç·åœ¢ã§ãããä¿åããæ¹æ³ããããŸãã ããã«ãæåãé çªã«åŠçããããšãã䟿å©ãªäºå®ããããŸããã€ãŸããæåã®åºçŸããã§ã«åãåã£ãŠããå Žåãè¡å šäœãåŠçããå¿ èŠã¯ãããŸããã
ããŠãããšãã°ãã³ãŒãã®äžéšïŒ
void calc_prefix_function(vector<int> & prefix_func, const string & str) { const size_t str_length = str.size(); prefix_func.clear(); prefix_func.resize(str_length); if (0 == str_length) return; prefix_func[0] = 0; for (size_t current = 1; current < str_length; ++current) { size_t matched_prefix = current - 1; size_t candidate = prefix_func[matched_prefix]; while (candidate != 0 && str[current] != str[candidate]) { matched_prefix = prefix_func[matched_prefix] - 1; candidate = prefix_func[matched_prefix]; } if (candidate == 0) prefix_func[current] = str[current] == str[0] ? 1 : 0; else prefix_func[current] = candidate + 1; } }
void calc_prefix_function(vector<int> & prefix_func, const string & str) { const size_t str_length = str.size(); prefix_func.clear(); prefix_func.resize(str_length); if (0 == str_length) return; prefix_func[0] = 0; for (size_t current = 1; current < str_length; ++current) { size_t matched_prefix = current - 1; size_t candidate = prefix_func[matched_prefix]; while (candidate != 0 && str[current] != str[candidate]) { matched_prefix = prefix_func[matched_prefix] - 1; candidate = prefix_func[matched_prefix]; } if (candidate == 0) prefix_func[current] = str[current] == str[0] ? 1 : 0; else prefix_func[current] = candidate + 1; } }
ã¢ã«ãŽãªãºã ãããè€éã§ãããšããäºå®ã«ããããããããã®å®è£ ã¯Zé¢æ°ãããããã«åçŽã§ãã
ãã®ä»ã®æ€çŽ¢ã¿ã¹ã¯
ãã®åŸãæååæ€çŽ¢ã¿ã¹ã¯ã¯ããã«éå®ããããä»ã®ã¿ã¹ã¯ããã³ä»ã®ãœãªã¥ãŒã·ã§ã³ããããããèå³ããªãå Žåã¯ããã«èªãããšã¯ã§ããªããšããæçŽããããããããŸãã ãã®æ å ±ã¯ãåã«æ £ããããã®ãã®ã§ãããå¿ èŠã«å¿ããŠãå°ãªããšãããã¹ãŠãç§ãã¡ã®åã«çãŸãããããšã«æ³šæããè»èŒªãåçºæããããšã¯ãããŸããã
äžèšã®ã¢ã«ãŽãªãºã ã¯ç·åœ¢å®è¡æéãä¿èšŒããŸããããã€ã€ãŒã»ã ãŒã¢ã¢ã«ãŽãªãºã ã¯ãããã©ã«ãã¢ã«ãŽãªãºã ããšããã¿ã€ãã«ãåãåããŸããã å¹³åãããšãç·åœ¢æéãåŸãããŸããããã®ç·åœ¢é¢æ°ã®ããè¯ãå®æ°ããããŸãããããã¯å¹³åã§ãã ãæªããããŒã¿ããããŸããããã®ããŒã¿ã¯åçŽãªãæ£é¢ãã®æ¯èŒãããåªããŠããŸãïŒãŸããqsortãšåãããã«ïŒã ããã¯éåžžã«çŽããããã®ã§ãèæ ®ããŸãã-ãšã«ããããã¡ããã èªç¶èšèªã®ããã¹ãåŠçã«çŠç¹ãåœãŠããã®æé©åã«ãããŠåèªã®çµ±èšçç¹æ§ã«äŸåããå€ãã®ãšããŸããã¯ãªã¢ã«ãŽãªãºã ããããŸãã
ããŠãOïŒ| X | + | A |ïŒã®äœããã®æ¹æ³ã§æååå ã®éšåæååãæ€çŽ¢ããã¢ã«ãŽãªãºã ããããŸãã ããã§ãã²ã¹ãããã¯ãšã³ãžã³ãäœæããŠãããšããŸãã çŠæ¢ãããŠãããããã€ãªåèªã®ãªã¹ãããããŸãïŒããã¯åœ¹ã«ç«ããªãããšã¯æããã§ãããã¿ã¹ã¯ã¯åãªãäŸã§ãïŒã ã¡ãã»ãŒãžããã£ã«ã¿ãªã³ã°ããŸãã ã¡ãã»ãŒãžå ã®çŠæ¢ãããŠããååèªãæ€çŽ¢ãã... OïŒ| X 1 | + | X 2 | + ... + | X n | + n | A |ïŒãå¿ èŠã§ãã ã©ãããããããç¹ã«ãå倧ã§å匷ããã®ã匷倧ãªè¡šçŸãã®èŸæžãéåžžã«ã匷倧ãã§ããå Žåã ãã®å Žåãæ€çŽ¢æååã®èŸæžãååŠçããŠãæ€çŽ¢ãOïŒ| X 1 | + | X 2 | + ... + | X n | + | A |ïŒã®ã¿ãå ããããã«ããæ¹æ³ããããŸããã¡ãã»ãŒãžãé·ãå Žåã
ãã®ãããªååŠçã¯ãèŸæžãããã©ã€ãæ§ç¯ããããšã«ãªããŸããããªãŒã¯ãããŒã®ã«ãŒãããå§ãŸããããŒãã¯èŸæžã®åèªã®æåã«å¯Ÿå¿ããããªãŒããŒãã®æ·±ãã¯åèªã®æåã®æ°ã«å¯Ÿå¿ããŸãã èŸæžããåèªãçµããããŒãã¯ã¿ãŒããã«ãšåŒã°ããäœããã®æ¹æ³ã§ããŒã¯ãããŸãïŒå³ã®èµ€ïŒã

çµæã®ããªãŒã¯ãKMPã¢ã«ãŽãªãºã ã®ãã¬ãã£ãã¯ã¹é¢æ°ã«é¡äŒŒããŠããŸãã ããã䜿çšãããšãèŸæžå¥å ã®ãã¹ãŠã®åèªã®åºçŸç®æããã¹ãŠæ€çŽ¢ã§ããŸãã ããªãŒã調ã¹ãŠãããªãŒããŒãã®åœ¢ã§æ¬¡ã®æåã®ååšã確èªããåæã«çµç«¯ã®é ç¹ãããŒã¯ããå¿ èŠããããŸã-ãããã¯åèªã®åºçŸã§ãã ããªãŒã«å¯Ÿå¿ããããŒãããªãå ŽåãILCã®å Žåãšåæ§ã«ãç¹å¥ãªãªã³ã¯ã䜿çšããŠããªãŒã®äžäœã§ããŒã«ããã¯ãçºçããŸãã ãã®ã¢ã«ãŽãªãºã ã¯ãAho-Korasikã¢ã«ãŽãªãºã ãšåŒã°ããŸã ã åãã¹ããŒã ã䜿çšããŠãå ¥åæã«æ€çŽ¢ããé»åèŸæžã®æ¬¡ã®æåãäºæž¬ã§ããŸãã
ãã®äŸã§ã¯ãããã³ã®äœæã¯ç°¡åã§ããããã³ã«é çªã«åèªãè¿œå ããã ãã§ãïŒãããã¯ããã¯ãçšã®è¿œå ãªã³ã¯ã®ã¿ã®ãã¥ã¢ã³ã¹ïŒã ãã®ããªãŒã®ã¡ã¢ãªäœ¿çšéãæžããããšãç®çãšããæé©åãããã€ããããŸãïŒããããããã³å§çž®-åå²ããã«ã»ã¯ã·ã§ã³ãã¹ãããããïŒã å®éã«ã¯ããããã®æé©åã¯ã»ãŒå¿ é ã§ãã ãã®ã¢ã«ãŽãªãºã ã®æ¬ ç¹ã¯ãã¢ã«ãã¡ãããé ã®äŸåæ§ã§ããããŒããšå æã¡ã¢ãªã®åŠçæéã¯ãæœåšçãªåã®æ°ã«äŸåããããã¯ã¢ã«ãã¡ãããã®ãµã€ãºã«çãããªããŸãã 倧ããªã¢ã«ãã¡ãããã®å Žåãããã¯æ·±å»ãªåé¡ã§ãïŒUnicodeæåã®ã»ãããæ³åã§ããŸããïŒïŒã ãã®ãã¹ãŠã«ã€ããŠããã®habratopikaã§ããŸãã¯Googleã€ã³ããã¯ã¹ã䜿çšããŠè©³çŽ°ãèªãããšãã§ããŸã-ãã®åé¡ã«é¢ããå€ãã®æ å ±ããããŸãã
次ã«ãå¥ã®ã¿ã¹ã¯ãèŠãŠã¿ãŸãããã åã®ãã®ã§ãåŸã§æ¥ãããŒã¿ã§äœãèŠã€ããå¿ èŠãããããäºåã«ç¥ã£ãŠããå Žåãããã§ã¯ãŸã£ããéã§ãïŒäºåã«åœŒããæ€çŽ¢ããè¡ãäžããããŸããããæ€çŽ¢ãããã®ã¯äžæã§ããã圌ãã¯å€ããæ€çŽ¢ããŸã å žåçãªäŸã¯æ€çŽ¢ãšã³ãžã³ã§ãã åèªãæ€çŽ¢ãããããã¥ã¡ã³ãã¯äºåã«ç¥ãããŠããŸãããããã§æ€çŽ¢ãããåèªã¯å€åºå ã«æ£ãã°ã£ãŠããŸãã ããã§ããOïŒ| X 1 | + | X 2 | + ... + | X n | + n | A |ïŒã®ä»£ããã«OïŒ| X 1 | + | X 2 | + ... + | X n | + | A |ïŒïŒ
æ¢åã®æååã®ãã¹ãŠã®å¯èœãªæ¥å°ŸèŸãååšããããŠçŽ ãæ§ç¯ããããšãææ¡ãããŠããŸãã 次ã«ããã³ãã¬ãŒãã®æ€çŽ¢ã¯ãç®çã®ãã³ãã¬ãŒãã«å¯Ÿå¿ããããªãŒå ã®ãã¹ã®ååšããã§ãã¯ããããšã«ãªããŸãã ãã¹ãŠã®æ¥å°ŸèŸã培åºçã«æ€çŽ¢ããŠãã®ãããªããŠçŽ ãäœæããå Žåããã®æé ã«ã¯OïŒ| A | 2 ïŒæéãšå€§éã®ã¡ã¢ãªãå¿ èŠã«ãªããŸãã ãããã幞ããªããšã«ãå§çž®ããªãŒã§ãã®ãããªããªãŒãããã«æ§ç¯ã§ããã¢ã«ãŽãªãºã ããããŸã- ãµãã£ãã¯ã¹ããªãŒ ããããŠOïŒ| A |ïŒã§ãããè¡ããŸãã æè¿Habréã§ããã«é¢ããèšäºããããŸããã®ã§ãèå³ã®ãã人ã¯ããã§Ukkonenã¢ã«ãŽãªãºã ã«ã€ããŠèªãããšãã§ããŸãã
éåžžãæ¥å°ŸèŸããªãŒã«ã¯æªãç¹ã2ã€ãããŸããããã¯ããªãŒã§ãããšããããšãšãããªãŒã®ããŒããã¢ã«ãã¡ãããé ã«äŸåããŠãããšããããšã§ãã ãµãã£ãã¯ã¹é åã¯ãããã®æ¬ ç¹ãå ããŠããŸãã æ¥å°ŸèŸé åã®æ¬è³ªã¯ãæååã®ãã¹ãŠã®æ¥å°ŸèŸã䞊ã¹æ¿ããããŠããå Žåãéšåæååã®æ€çŽ¢ã¯ãç®çã®ãã¿ãŒã³ã®æåã®æåã§é£æ¥ããæ¥å°ŸèŸã®ã°ã«ãŒããæ€çŽ¢ããåŸç¶ã®ãã®ã®ç¯å²ãããã«çµã蟌ãããšã«ãªããŸãã åæã«ããµãã£ãã¯ã¹èªäœããœãŒãããã圢åŒã§ä¿åããå¿ èŠã¯ãããŸãã;ãœãŒã¹ããŒã¿ã§ãµãã£ãã¯ã¹ãå§ãŸãäœçœ®ãä¿åããã ãã§ååã§ãã 確ãã«ããã®æ§é ã®æéäŸåæ§ã¯ãããã«æªããªããŸãã1åã®æ€çŽ¢ã§ã¯ãèããŠãã¹ãŠãæ éã«è¡ããšOïŒ| X | + log | A |ïŒããããæ°ã«ããªãå Žåã¯OïŒ| X | log | A |ïŒã§ãã æ¯èŒã®ããã«ãåºå®ã¢ã«ãã¡ãããOïŒ| X |ïŒã®ããªãŒã§ã ãã ãããããããªãŒã§ã¯ãªãé åã§ãããšããäºå®ã¯ãã¡ã¢ãªãã£ãã·ã³ã°ã®ç¶æ³ãæ¹åããããã»ããµé·ç§»äºæž¬ã®ã¿ã¹ã¯ã容æã«ããŸãã ãµãã£ãã¯ã¹é åã¯ãKÀrkkÀinen-Sandersã¢ã«ãŽãªãºã ã䜿çšããŠç·åœ¢æéã§æ§ç¯ãããŸãïŒãã¿ãŸãããããã·ã¢èªã§ã©ã®ããã«èããããã¯ã»ãšãã©ããããŸããïŒã ä»æ¥ãããã¯æã人æ°ã®ããè¡ã®ã€ã³ããã¯ã¹ä»ãæ¹æ³ã®1ã€ã§ãã
ããã§ã¯ãè¿äŒŒæååæ€çŽ¢ãšé¡äŒŒåºŠã®åæã®è³ªåã«ã¯è§ŠããŸãããããã¯ããã®èšäºã«è©°ã蟌ãã«ã¯åºãããé åã§ãã ç§ã¯ãã 人ã ãããã§ãã³ãäœãããã«é£ã¹ããå€ãã®ç°ãªãã¢ãããŒããèãåºããã®ã§ãããªããåæ§ã®åé¡ã«ééããããèŠã€ããŠèªãã§ãã ããã ããããããã®åé¡ã¯ãã§ã«è§£æ±ºãããŠããŸãã
èªãã§ããã人ã«æè¬ããŸãïŒ ãããŠããããèªãã 人ã«ãã©ããããããšãïŒ
UPDïŒããŠçŽ ã«é¢ããéèŠãªèšäºãžã®ãªã³ã¯ãè¿œå ããŸããïŒã¬ã€ã§ããããã¬ãã£ãã¯ã¹ããªãŒã§ãããããŒããããããªãŒã§ããããã©ã€ã§ãïŒã