المهمة · سلاسل نصية صعب JavaScript ·
Count distinct substrings
Return the number of different non-empty substrings of s (contiguous pieces; equal pieces at different positions count once). s has lowercase letters only and can be up to 100,000 characters long.
توقيع الدالة
/**
* @param {string} s
* @returns {number}
*/
function count_distinct_substrings(s)أمثلة
count_distinct_substrings("abab") // -> 7
count_distinct_substrings("aaa") // -> 3
count_distinct_substrings("") // -> 0بالإضافة إلى 8 اختبارات مخفية و3 اختبارات مدخلات ضخمة ضمن حد زمني؛ لا تُعرض مدخلاتها. تُقدَّم المهام للنماذج باللغة الإنجليزية.
المركز 1MiniMax M3.1 Flashمحلولة · 14 من أصل 14 اختباراتتمت الإجابة في 5.8 ثوانٍ · زمن التشغيل 388 مللي ثانية · $0.0009 ✓ count_distinct_substrings("abab")المتوقع 7 2 مللي ثانية ✓ count_distinct_substrings("aaa")المتوقع 3 <1 مللي ثانية ✓ count_distinct_substrings("")المتوقع 0 1 مللي ثانية ✓ 1 مللي ثانية✓ <1 مللي ثانية✓ <1 مللي ثانية✓ <1 مللي ثانية✓ 2 مللي ثانية✓ 28 مللي ثانية✓ 1 مللي ثانية✓ <1 مللي ثانية⏱ 292 مللي ثانية⏱ 22 مللي ثانية⏱ 35 مللي ثانيةالكود
function count_distinct_substrings(s) { const n = s.length; if (n === 0) return 0; const maxStates = 2 * n + 1; const tr = new Int32Array(maxStates * 26); const len = new Int32Array(maxStates); const link = new Int32Array(maxStates); link[0] = -1; let size = 1; let last = 0; for (let i = 0; i < n; i++) { const c = s.charCodeAt(i) - 97; const cur = size++; len[cur] = len[last] + 1; let p = last; while (p !== -1) { const idx = p * 26 + c; if (tr[idx] !== 0) break; tr[idx] = cur; p = link[p]; } if (p === -1) { link[cur] = 0; } else { const q = tr[p * 26 + c]; if (len[p] + 1 === len[q]) { link[cur] = q; } else { const clone = size++; len[clone] = len[p] + 1; link[clone] = link[q]; const cb = clone * 26, qb = q * 26; for (let k = 0; k < 26; k++) tr[cb + k] = tr[qb + k]; while (p !== -1) { const idx = p * 26 + c; if (tr[idx] !== q) break; tr[idx] = clone; p = link[p]; } link[q] = clone; link[cur] = clone; } } last = cur; } let total = 0; for (let v = 1; v < size; v++) total += len[v] - len[link[v]]; return total; }المركز 2Google Gemini 3.8 Flashمحلولة · 14 من أصل 14 اختباراتتمت الإجابة في 6.4 ثوانٍ · زمن التشغيل 487 مللي ثانية · $0.0026 ✓ count_distinct_substrings("abab")المتوقع 7 6 مللي ثانية ✓ count_distinct_substrings("aaa")المتوقع 3 1 مللي ثانية ✓ count_distinct_substrings("")المتوقع 0 1 مللي ثانية ✓ <1 مللي ثانية✓ 1 مللي ثانية✓ 1 مللي ثانية✓ 17 مللي ثانية✓ 2 مللي ثانية✓ 1 مللي ثانية✓ 1 مللي ثانية✓ <1 مللي ثانية⏱ 330 مللي ثانية⏱ 99 مللي ثانية⏱ 25 مللي ثانيةالكود
/** * @param {string} s * @returns {number} */ function count_distinct_substrings(s) { const n = s.length; if (n === 0) return 0; if (n === 1) return 1; // Suffix Automaton (SAM) approach // Max states: 2 * n const maxStates = 2 * n; const link = new Int32Array(maxStates); const len = new Int32Array(maxStates); // 26 transitions per state const nextState = new Int32Array(maxStates * 26); nextState.fill(-1); link[0] = -1; len[0] = 0; let sz = 1; let last = 0; for (let i = 0; i < n; i++) { const c = s.charCodeAt(i) - 97; const cur = sz++; len[cur] = len[last] + 1; let p = last; while (p !== -1 && nextState[p * 26 + c] === -1) { nextState[p * 26 + c] = cur; p = link[p]; } if (p === -1) { link[cur] = 0; } else { const q = nextState[p * 26 + c]; if (len[p] + 1 === len[q]) { link[cur] = q; } else { const clone = sz++; len[clone] = len[p] + 1; link[clone] = link[q]; // copy transitions const qOffset = q * 26; const cloneOffset = clone * 26; for (let k = 0; k < 26; k++) { nextState[cloneOffset + k] = nextState[qOffset + k]; } while (p !== -1 && nextState[p * 26 + c] === q) { nextState[p * 26 + c] = clone; p = link[p]; } link[q] = clone; link[cur] = clone; } } last = cur; } let ans = 0; for (let i = 1; i < sz; i++) { ans += len[i] - len[link[i]]; } return ans; }المركز 3Qwen3.8 Max (0902)محلولة · 14 من أصل 14 اختباراتتمت الإجابة في 33 ثوانٍ · زمن التشغيل 952 مللي ثانية · $0.01 ✓ count_distinct_substrings("abab")المتوقع 7 2 مللي ثانية ✓ count_distinct_substrings("aaa")المتوقع 3 1 مللي ثانية ✓ count_distinct_substrings("")المتوقع 0 1 مللي ثانية ✓ <1 مللي ثانية✓ 1 مللي ثانية✓ 27 مللي ثانية✓ 1 مللي ثانية✓ <1 مللي ثانية✓ 1 مللي ثانية✓ 1 مللي ثانية✓ <1 مللي ثانية⏱ 435 مللي ثانية⏱ 361 مللي ثانية⏱ 117 مللي ثانيةالكود
function count_distinct_substrings(s) { const n = s.length; if (n === 0) return 0; // Build suffix array using prefix doubling let sa = new Array(n); let rank = new Array(n); let tmp = new Array(n); for (let i = 0; i < n; i++) { sa[i] = i; rank[i] = s.charCodeAt(i); } for (let k = 1; k < n; k <<= 1) { const r = rank; // capture current rank const cmp = (a, b) => { if (r[a] !== r[b]) return r[a] - r[b]; const ra = a + k < n ? r[a + k] : -1; const rb = b + k < n ? r[b + k] : -1; return ra - rb; }; sa.sort(cmp); tmp[sa[0]] = 0; for (let i = 1; i < n; i++) { tmp[sa[i]] = tmp[sa[i-1]] + (cmp(sa[i-1], sa[i]) < 0 ? 1 : 0); } [rank, tmp] = [tmp, rank]; if (rank[sa[n-1]] === n - 1) break; } // Kasai's algorithm for LCP array // rank[i] = position of suffix i in suffix array let lcpSum = 0; let h = 0; for (let i = 0; i < n; i++) { if (rank[i] > 0) { let j = sa[rank[i] - 1]; while (i + h < n && j + h < n && s.charCodeAt(i + h) === s.charCodeAt(j + h)) h++; lcpSum += h; if (h > 0) h--; } else { h = 0; } } return n * (n + 1) / 2 - lcpSum; }المركز 4SpaceXAI Grok Build 0.1غير محلولة · 11 من أصل 14 اختباراتتمت الإجابة في 37 ثوانٍ · زمن التشغيل 1.9 ثوانٍ · $0.02 ✓ count_distinct_substrings("abab")المتوقع 7 2 مللي ثانية ✓ count_distinct_substrings("aaa")المتوقع 3 1 مللي ثانية ✓ count_distinct_substrings("")المتوقع 0 22 مللي ثانية ✓ 2 مللي ثانية✓ 1 مللي ثانية✓ 3 مللي ثانية✓ 1 مللي ثانية✓ <1 مللي ثانية✓ 2 مللي ثانية✓ 2 مللي ثانية✓ 1 مللي ثانية⏱ تجاوز الوقت المسموح⏱ تجاوز الوقت المسموح⏱ تجاوز الوقت المسموحالكود
function count_distinct_substrings(s) { const n = s.length; if (n === 0) return 0; const MAX = 2 * n + 10; const len = new Array(MAX); const link = new Array(MAX); const trans = new Array(MAX); for (let i = 0; i < MAX; i++) { trans[i] = new Array(26).fill(-1); } let tot = 1; len[0] = 0; link[0] = -1; let last = 0; for (let i = 0; i < n; i++) { const c = s.charCodeAt(i) - 97; let cur = tot++; len[cur] = len[last] + 1; let p = last; while (p !== -1 && trans[p][c] === -1) { trans[p][c] = cur; p = link[p]; } if (p === -1) { link[cur] = 0; } else { let q = trans[p][c]; if (len[q] === len[p] + 1) { link[cur] = q; } else { let clone = tot++; len[clone] = len[p] + 1; link[clone] = link[q]; for (let j = 0; j < 26; j++) { trans[clone][j] = trans[q][j]; } while (p !== -1 && trans[p][c] === q) { trans[p][c] = clone; p = link[p]; } link[q] = clone; link[cur] = clone; } } last = cur; } let count = 0; for (let i = 1; i < tot; i++) { count += len[i] - len[link[i]]; } return count; }المحاولة الثانية
محلولة · 14 من أصل 14 اختباراتتمت الإجابة في 27 ثوانٍ · $0.01اطلع النموذج على عدد الاختبارات التي فشلت، مع الأمثلة الخاطئة وقيمها المتوقعة والراجعة، واطلع على سبب فشل الاختبارات الخفية فقط دون مدخلاتها. لا تؤثر هذه المحاولة في الترتيب أو التقييم.
✓ count_distinct_substrings("abab")المتوقع 7 2 مللي ثانية ✓ count_distinct_substrings("aaa")المتوقع 3 <1 مللي ثانية ✓ count_distinct_substrings("")المتوقع 0 <1 مللي ثانية ✓ 1 مللي ثانية✓ 2 مللي ثانية✓ 1 مللي ثانية✓ <1 مللي ثانية✓ <1 مللي ثانية✓ <1 مللي ثانية✓ <1 مللي ثانية✓ 1 مللي ثانية⏱ 250 مللي ثانية⏱ 46 مللي ثانية⏱ 117 مللي ثانيةالكود
function count_distinct_substrings(s) { const n = s.length; if (n === 0) return 0; const MAX = 2 * n + 5; const len = new Int32Array(MAX); const link = new Int32Array(MAX); const trans = new Int32Array(MAX * 26); trans.fill(-1); let tot = 1; len[0] = 0; link[0] = -1; let last = 0; for (let i = 0; i < n; i++) { const c = s.charCodeAt(i) - 97; let cur = tot++; len[cur] = len[last] + 1; let p = last; while (p !== -1 && trans[p * 26 + c] === -1) { trans[p * 26 + c] = cur; p = link[p]; } if (p === -1) { link[cur] = 0; } else { let q = trans[p * 26 + c]; if (len[q] === len[p] + 1) { link[cur] = q; } else { let clone = tot++; len[clone] = len[p] + 1; link[clone] = link[q]; const qbase = q * 26; const clonebase = clone * 26; for (let j = 0; j < 26; j++) { trans[clonebase + j] = trans[qbase + j]; } while (p !== -1 && trans[p * 26 + c] === q) { trans[p * 26 + c] = clone; p = link[p]; } link[q] = clone; link[cur] = clone; } } last = cur; } let count = 0; for (let i = 1; i < tot; i++) { count += len[i] - len[link[i]]; } return count; }
تكلفة الرموز: $0.05 · كيف تُدار الجولات وتُحتسب النقاط ←