結果
| 問題 |
No.430 文字列検索
|
| コンテスト | |
| ユーザー |
matsu7874
|
| 提出日時 | 2016-10-02 22:49:12 |
| 言語 | JavaScript (node v23.5.0) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 1,927 bytes |
| コンパイル時間 | 189 ms |
| コンパイル使用メモリ | 6,952 KB |
| 実行使用メモリ | 53,880 KB |
| 最終ジャッジ日時 | 2024-11-10 00:02:28 |
| 合計ジャッジ時間 | 3,484 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | -- * 4 |
| other | AC * 1 TLE * 1 -- * 12 |
ソースコード
var BoyerMoore = function (pattern) {
this.pattern = pattern;
this.skip = this.buildSkip(pattern);
this.next = this.buildNext(pattern);
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"));
matsu7874