提出 #66637911


ソースコード 拡げる

const fs = require('fs');

const input = fs.readFileSync('/dev/stdin', 'utf8').trim().split('\n');
const [N, Q] = input[0].split(' ').map(Number);
const S = input[1];
const queries = input.slice(2).map(line => line.split(' ').map(Number));

const MOD = 10n ** 9n + 7n;
const BASE = 31n;

// 文字列のプレフィックスハッシュと base の累乗を事前に計算
const prefixHash = Array(N + 1).fill(0n);
const power = Array(N + 1).fill(1n);

for (let i = 0; i < N; i++) {
  const code = BigInt(S.charCodeAt(i) - 97 + 1);
  prefixHash[i + 1] = (prefixHash[i] * BASE + code) % MOD;
  power[i + 1] = (power[i] * BASE) % MOD;
}

// 区間 [l, r](1-indexed)のハッシュを取得
function getHash(l, r) {
  const hash = (prefixHash[r] - (prefixHash[l - 1] * power[r - l + 1]) % MOD + MOD) % MOD;
  return hash;
}

const output = [];
for (const [a, b, c, d] of queries) {
  output.push(getHash(a, b) === getHash(c, d) ? 'Yes' : 'No');
}

console.log(output.join('\n'));

提出情報

提出日時
問題 A56 - String Hash
ユーザ myoshizumi
言語 JavaScript (Node.js 18.16.1)
得点 1000
コード長 1013 Byte
結果 AC
実行時間 513 ms
メモリ 145224 KiB

ジャッジ結果

セット名 Sample All
得点 / 配点 0 / 0 1000 / 1000
結果
AC × 1
AC × 11
セット名 テストケース
Sample sample_01.txt
All killer_01.txt, max_01.txt, max_02.txt, max_03.txt, min_01.txt, random_01.txt, random_02.txt, random_03.txt, random_04.txt, random_05.txt, sample_01.txt
ケース名 結果 実行時間 メモリ
killer_01.txt AC 513 ms 136712 KiB
max_01.txt AC 363 ms 143068 KiB
max_02.txt AC 399 ms 143716 KiB
max_03.txt AC 403 ms 144264 KiB
min_01.txt AC 39 ms 42788 KiB
random_01.txt AC 497 ms 138012 KiB
random_02.txt AC 471 ms 137928 KiB
random_03.txt AC 462 ms 145224 KiB
random_04.txt AC 434 ms 145096 KiB
random_05.txt AC 421 ms 144952 KiB
sample_01.txt AC 38 ms 42852 KiB