E. [2025 新生训练赛 2] 摩斯电码(Hard ver.)

    传统题 1000ms 256MiB

[2025 新生训练赛 2] 摩斯电码(Hard ver.)

该比赛已结束,您无法在比赛模式下递交该题目。您可以点击“在题库中打开”以普通模式查看和递交本题。

题目描述

本题为 A. 摩斯电码(Easy ver.) 的困难版本,共享部分题面。

摩斯电码(英语:Morse code)是一种时通时断的信号代码,通过不同的排列顺序来表达不同的英文字母、数字和标点符号。由美国发明家萨缪尔·摩尔斯及其助手艾尔菲德·维尔在 1836 年发明。

摩斯电码是一种早期的数字化通信形式,在本题中,约定它的代码包括三种:

  • 点(.

  • 划(-

  • 单词间的分隔符(/),将电码转为明文时遇到此字符,将此字符转换成空格;其他情况不要输出空格

本题约定,字符的摩斯电码之间用空格隔开,字符与代码的对应关系如下(码表中的字母仅含大写,所有字符均为半角字符):

给你一个字符串,输出对应的摩斯电码。转换的具体规则如下:

  • 小写字母视作大写字母;

  • 字母(分隔符)的摩斯电码之间用空格隔开;

  • 空格转换为 /(分隔符)。

输入格式

第一行一个整数 n(1n105)n(1\le n\le 10^5),表示字符串的长度。

第二行一个长度为 nn 的字符串 ss,保证只由英文字母、数字、点号(.)、逗号(,)和空格组成,头尾处不可能是空格。

由于输入的字符串 ss 含有空格,建议程序按如下方式读取输入数据(C++):

cin >> n;
getchar();        // 吃掉输入 n 后的换行符
getline(cin, s);  // 读取整行

输出格式

一行,字符串 ss 对应的摩斯电码。

样例数据

输入 #1

44
The quick brown FOX jumps over the lazy DOG.

输出 #1

- .... . / --.- ..- .. -.-. -.- / -... .-. --- .-- -. / ..-. --- -..- / .--- ..- -- .--. ... / --- ...- . .-. / - .... . / .-.. .- --.. -.-- / -.. --- --. .-.-.-

说明/提示

建议在学会 C++ 基础语法(或 Python 基础语法)以及字符串知识的情况下完成本题。

部分参考代码(C++):

string letterMorse[26] = {
    ".-",    // A
    "-...",  // B
    "-.-.",  // C
    "-..",   // D
    ".",     // E
    "..-.",  // F
    "--.",   // G
    "....",  // H
    "..",    // I
    ".---",  // J
    "-.-",   // K
    ".-..",  // L
    "--",    // M
    "-.",    // N
    "---",   // O
    ".--.",  // P
    "--.-",  // Q
    ".-.",   // R
    "...",   // S
    "-",     // T
    "..-",   // U
    "...-",  // V
    ".--",   // W
    "-..-",  // X
    "-.--",  // Y
    "--.."   // Z
};

string numMorse[10] = {
    "-----",  // 0
    ".----",  // 1
    "..---",  // 2
    "...--",  // 3
    "....-",  // 4
    ".....",  // 5
    "-....",  // 6
    "--...",  // 7
    "---..",  // 8
    "----."   // 9
};

string dotMorse = ".-.-.-";
string commaMorse = "--..--";

双创实验室2025级新生训练赛-第2场

未参加
状态
已结束
规则
ACM/ICPC
题目
8
开始于
2025-9-6 14:00
结束于
2025-9-6 17:00
持续时间
3 小时
主持人
参赛人数
43