結果
問題 |
No.430 文字列検索
|
ユーザー |
![]() |
提出日時 | 2016-10-02 22:46:08 |
言語 | JavaScript (node v23.5.0) |
結果 |
WA
|
実行時間 | - |
コード長 | 1,965 bytes |
コンパイル時間 | 87 ms |
コンパイル使用メモリ | 6,816 KB |
実行使用メモリ | 57,456 KB |
最終ジャッジ日時 | 2024-11-10 00:02:16 |
合計ジャッジ時間 | 5,477 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | -- * 4 |
other | WA * 1 TLE * 1 -- * 12 |
ソースコード
var BoyerMoore = function (pattern) { this.pattern = pattern; this.skip = this.buildSkip(pattern); this.next = this.buildNext(pattern); console.log(this.skip,this.next); return this; } BoyerMoore.prototype.buildSkip = function (pattern) { var m = pattern.length; var skip = {}; for (var i = 0; i < m; i++) { skip[pattern[i]] = m - i - 1; } return skip; } BoyerMoore.prototype.buildNext = function (pattern) { var m = pattern.length; var g = []; for (var i = 0; i < m; i++) { g.push(m); } var next = []; for (var i = 0; i < m; i++) { next.push(2 * m - i - 1); } var j = m; for (var i = m - 1; i >= 0; i-- , j--) { g[i] = j; while (j < m && pattern[j] !== pattern[i]) { next[j] = Math.min(next[j], m - i - 1); j = g[j]; } } for (var i = 0; i < m; i++) { next[i] = Math.min(next[i], j + m - i) if (i >= j) { j = g[j]; } } return next; } BoyerMoore.prototype.match = function (text, pattern, skip, next) { pattern = pattern || this.pattern; skip = skip||this.skip; next = next || this.next; var n = text.length; var m = pattern.length; var count = 0; for (var i = m - 1; i < n;) { var j = m - 1; while (j >= 0 && text[i] == pattern[j]) { i--; j--; } if (j < 0) { count++; i += m + 1; } else { i += Math.max(skip[text[i]] || 0, next[j]); } } return count; } function Main(input) { var data = input.split("\n") var text = data[0]; var m = Number(data[1]); var total = 0; var i; for (i=0; i<m; ++i){ var pattern = data[i+2]; var bm = new BoyerMoore(pattern); total += bm.match(text); } console.log(total); } Main(require("fs").readFileSync("/dev/stdin", "utf8"));