题目大意
根据序列中的aia_iai 得到2ai2^{a_i}2ai 记为AAA,再找对应的aja_jaj ,得到2aj2^{a_j}2aj 记为BBB,如果ABA^BAB=BAB^ABA,则认为找到了一组答案。
题目思路
1. 读入每个样例的乐谱数据数量 nnn。
2. 使用 map 存储每个地址 AAA 的出现次数。
3. 遍历 map,对于每个地址 AAA,如果其出现次数大于等于2,计算能够组成的按键地址数量并累加。这个循环遍历map中的每个元素(即每个不同的aia_iai 及其出现次数)。如果某个 aia_iai 出现了至少两次(i.second >= 2),那么它可以与自己组合成完整的地址。组合数可以通过组合公式 C(n, 2) = n(n-1) / 2计算,即从这些重复的 aia_iai 中选择两个不同的进行组合。
4. 特殊情况。对于 aia_iai = 111 和aja_jaj = 222,它们对应的地址 AAA = 212^121 = 222 和 BBB = 222^222 = 444 满足$ A^B$ = BAB^ABA。因此,如果输入中有 111 和 222,那么它们之间可以相互配对。配对的总数是它们出现次数的乘积。
5. 输出最终的按键地址数量。
算法核心思想是通过 map 存储地址 AAA 的出现次数,然后遍历 map 计算满足条件的按键地址数量。最后输出结果。
时间复杂度分析
该算法的时间复杂度主要取决于遍历和统计 map 的操作,因此是 O(n)O(n)O(n) 的复杂度。
代码演示