function countCPCTFSubstrings(S) { const N = S.length; let count = 0; // 5つの位置(i, j, k, l, m)を選ぶ (0-indexed) for (let i = 0; i < N; i++) { for (let j = i + 1; j < N; j++) { for (let k = j + 1; k < N; k++) { for (let l = k + 1; l < N; l++) { for (let m = l + 1; m < N; m++) { // 選んだ位置の文字で部分文字列を構成 const sub = [S[i], S[j], S[k], S[l], S[m]]; // CPCTF的の条件をチェック // 1. 1文字目と3文字目が等しい (0-indexedでは0と2) // 2. それ以外のすべての文字ペアは異なる if (sub[0] === sub[2] && sub[0] !== sub[1] && sub[0] !== sub[3] && sub[0] !== sub[4] && sub[1] !== sub[2] && sub[1] !== sub[3] && sub[1] !== sub[4] && sub[2] !== sub[3] && sub[2] !== sub[4] && sub[3] !== sub[4]) { count++; } } } } } } return count; }