二重ローリングハッシュを使用して回文判定を行います。文字列を数値化し、前方向と後方向のハッシュ値を比較することで、O(1)時間での高速判定を実現します。
| 手法 | 前処理 | クエリ処理 | 総時間 | 精度 | 実装難易度 |
|---|---|---|---|---|---|
| 単純判定 | O(1) | O(N) | O(Q×N) | 100% | ★☆☆ |
| Manacher | O(N) | O(1) | O(N+Q) | 100% | ★★★ |
| 二重ハッシュ | O(N) | O(1) | O(N+Q) | 99.999% | ★★☆ |
文字列を多項式として数値化し、効率的に部分文字列のハッシュ値を計算します。
文字列を両方向からハッシュ化し、回文判定の準備を行います。
前方向と後方向のハッシュ値を比較して回文を判定します。2つの異なるハッシュ関数を使用することで、衝突確率を劇的に減少させます。
対象: "issi" (インデックス 4-7)
| ハッシュ種類 | 前方向値 | 後方向値 | 一致 |
|---|---|---|---|
| Hash₁ (base=257) | 計算中... | 計算中... | - |
| Hash₂ (base=263) | 計算中... | 計算中... | - |
| 最終判定 | 両方のハッシュが一致 | Yes | |
| データ構造 | サイズ | 目的 | 最大メモリ (N=10⁵) |
|---|---|---|---|
| forwardHash1[] | (N+1) × 8 bytes | 前方向第1ハッシュ | 808 KB |
| forwardHash2[] | (N+1) × 8 bytes | 前方向第2ハッシュ | 808 KB |
| backwardHash1[] | (N+1) × 8 bytes | 後方向第1ハッシュ | 808 KB |
| backwardHash2[] | (N+1) × 8 bytes | 後方向第2ハッシュ | 808 KB |
| power1[], power2[] | 2 × (N+1) × 8 bytes | 累乗値キャッシュ | 1616 KB |
| 合計 | 6 × (N+1) × 8 bytes | - | 約 4.8 MB |
実際の文字列で二重ハッシュアルゴリズムの動作を確認しましょう!
| 観点 | Manacher's Algorithm | BigInt + 二重ハッシュ |
|---|---|---|
| 実装難易度 | 高(複雑な境界処理) | 中(直感的なハッシュ計算) |
| デバッグ容易性 | 困難(インデックス計算複雑) | 容易(ハッシュ値で確認可能) |
| メモリ使用量 | O(N) - 1配列 | O(N) - 6配列 |
| 精度 | 100%(確定的) | 99.999%(確率的) |
| 拡張性 | 回文専用 | 文字列照合汎用 |
| クエリ | 範囲 | 部分文字列 | 前方向Hash₁ | 後方向Hash₁ | Hash₁一致 | Hash₂一致 | 最終結果 |
|---|---|---|---|---|---|---|---|
| 1 | [5,8] | "issi" | xxxxx1 | xxxxx1 | ✓ | ✓ | Yes |
| 2 | [6,10] | "ssipp" | xxxxx2 | yyyyy2 | ✗ | ✗ | No |
| 3 | [2,8] | "ississi" | xxxxx3 | xxxxx3 | ✓ | ✓ | Yes |
実際の数値でローリングハッシュの計算過程を可視化します!