题目描述

一个 16 格的彩笔盒,每格一支笔,颜色用大写字母表示。输入一行 16 个大写字母;题面保证若有同色,只会有一种且恰好 2 支。 若 16 支颜色全不同输出 different,否则按先小后大的顺序输出那两支同色笔的编号。样例输入 ABCDEFAHIJPLMNOT,样例输出 1 7。

思路

从左往右扫一遍,用数组记下每种颜色首次出现的编号;扫到已登记的颜色时,读出的旧编号一定更小,直接输出旧编号与当前编号。 扫完都没命中就输出 different。

参考代码

Python 版:

python
#!/usr/bin/env python3
# Author by Rainboy blog: https://rainboylv.com github: https://github.com/rainboylvx
# rbook: -> https://rbook.roj.ac.cn  https://rbook2.roj.ac.cn
# rainboy的学习导航网站: https://idx.roj.ac.cn
# create_at: 2026-10-01 01:37
# update_at: 2026-10-01 01:37

import sys


def repeated_pair(colors: str) -> tuple[int, int] | None:
    """返回那两支同色笔的编号(较小, 较大);16 支笔颜色全不同时返回 None。

    题面保证同色最多两支:边扫边记每种颜色首次出现的编号,第二次遇到即成答案,
    且先登记的编号一定更小,天然满足"先小后大"。
    """
    first: dict[str, int] = {}  # 颜色 -> 该颜色首次出现的笔编号
    for pos, color in enumerate(colors, 1):
        seen = first.get(color)  # 这个颜色之前登过记吗
        if seen is not None:
            return seen, pos
        first[color] = pos
    return None


def solve() -> None:
    colors = sys.stdin.buffer.read().decode().strip()
    pair = repeated_pair(colors)
    print("different" if pair is None else f"{pair[0]} {pair[1]}")


if __name__ == "__main__":
    solve()

C++ 版(同一算法):

cpp
/**
 * Author by Rainboy blog: https://rainboylv.com github: https://github.com/rainboylvx
 * rbook: -> https://rbook.roj.ac.cn  https://rbook2.roj.ac.cn
 * rainboy的学习导航网站: https://idx.roj.ac.cn
 * create_at: 2026-10-06 01:45
 * update_at: 2026-10-06 01:45
 */
#include <iostream>
#include <string>
using namespace std;

typedef long long ll;

ll first_pos[26]; // first_pos[c] 表示颜色 c 首次出现的笔编号,0 表示还没出现

int main() {
    string s;
    cin >> s;
    ll n = s.size();
    for (ll pos = 1; pos <= n; pos++) {
        ll color = s[pos - 1] - 'A'; // 把 A~Z 映射到 0~25
        if (first_pos[color] != 0) {
            // 这种颜色之前出现过,first_pos 里存的就是较小的编号
            cout << first_pos[color] << " " << pos << "\n";
            return 0;
        }
        first_pos[color] = pos;
    }
    cout << "different\n";
    return 0;
}