pat 7-7 莫尔斯码(Morse Code) (15分) 模拟

大家有木有看过带谍战剧?里面多数都有发电报的情节吧,有木有感觉滴滴答答地发报特别酷?
发报的那个东西,学名叫做“电键”,如图: 电键.jpg
电键按下去之后,电路接通,就会发出声音,长短不同的声音组合,就形成了不同的编码,可以表示不同的信息~
汉字个数太多,所以汉字的编码是很复杂的。但是英文字母比较少,编码就容易多了
我们今天来研究一种国际通用的电报编码——莫尔斯码。
我们用“滴(Di~)”来模拟电键短按发出的声音,用一个点(dot)表示: .
用“答(Da~)”来模拟电键长按发出的声音,用一个短划(dash)表示: -
英文字母和数字的莫尔斯码是:
在这里插入图片描述

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 --..
0 -----
1 .----
2 ..---
3 ...--
4 ....-
5 .....
6 -....
7 --...
8 ---..
9 ----.
例如求救信号 SOS 的莫尔斯码就是: ... --- ... (每个字母的编码中间空一格)
现在请将输入的编码转成文本、将输入的文本转成编码。

输入格式:

第一行为一个正整数N,
接下来N行,每行为不超过200个字符的文本或者编码。
我们把连续的一串字母或数字的组合称之为一个“单词”,输入的文本格式是:每个单词之间空一格,文本的首末两端没有空格,例如CQ CQ,文本仅有大写字母、数字、空格组成。
输入的编码的格式是:每个单词内的字母编码或数字编码之间空一格,每个单词之间用|分隔,例如 -.-. --.-|-.-. --.- (文本 CQ CQ的编码)
输出格式:

对每一行输入的文本或编码,采用相对应的格式,在一行中对应给出其编码或文本。
输入样例:

2
-.-. --.-|-.-. --.-|-.-. --.-|-… .|-… -… … … .-… .-|-… -… … … .-… .-|-.-
CQ CQ CQ DE BD5HLA BD5HLA K

输出样例:

CQ CQ CQ DE BD5HLA BD5HLA K
-.-. --.-|-.-. --.-|-.-. --.-|-… .|-… -… … … .-… .-|-… -… … … .-… .-|-.-


模拟瞎搞即可

#define debug
#ifdef debug
#include <time.h>
#include "win_majiao.h"
#endif

#include <iostream>
#include <algorithm>
#include <vector>
#include <string.h>
#include <map>
#include <set>
#include <stack>
#include <queue>
#include <math.h>

#define MAXN ((int)1e5+7)
#define ll long long int
#define INF (0x7f7f7f7f)
#define fori(lef, rig) for(int i=lef; i<=rig; i++)
#define forj(lef, rig) for(int j=lef; j<=rig; j++)
#define fork(lef, rig) for(int k=lef; k<=rig; k++)
#define QAQ (0)

using namespace std;
typedef vector<vector<int> > VVI;

#define show(x...) \
	do { \
		cout << "\033[31;1m " << #x << " -> "; \
		err(x); \
	} while (0)

void err() { cout << "\033[39;0m" << endl; }
template<typename T, typename... A>
void err(T a, A... x) { cout << a << ' '; err(x...); }

namespace FastIO{

	char print_f[105];
	void read() {}
	void print() { putchar('\n'); }

	template <typename T, typename... T2>
	   inline void read(T &x, T2 &... oth) {
		   x = 0;
		   char ch = getchar();
		   ll f = 1;
		   while (!isdigit(ch)) {
			   if (ch == '-') f *= -1; 
			   ch = getchar();
		   }
		   while (isdigit(ch)) {
			   x = x * 10 + ch - 48;
			   ch = getchar();
		   }
		   x *= f;
		   read(oth...);
	   }
	template <typename T, typename... T2>
	   inline void print(T x, T2... oth) {
		   ll p3=-1;
		   if(x<0) putchar('-'), x=-x;
		   do{
				print_f[++p3] = x%10 + 48;
		   } while(x/=10);
		   while(p3>=0) putchar(print_f[p3--]);
		   putchar(' ');
		   print(oth...);
	   }
} // namespace FastIO
using FastIO::print;
using FastIO::read;

int n, m, Q, K;

string buf;

map<string, string> mp;

void sloveA(string& ans, string& key) { 
	buf.push_back(' ');
	for(int i=0; buf[i]; i++) {
		if(buf[i] == ' ' || buf[i] == '|') {
			ans += mp[key];
			if(buf[i] == '|') ans.push_back(' ');
			key = "";
		} else {
			key.push_back(buf[i]);
		}
	}
}

void sloveB(string& ans, string& key) {
	
	mp[" "] = "|";
	int i = 0;
	for(i=0; buf[i]; i++) {
		string p = "";
		p.push_back(buf[i]);
		// ans += (mp[p] + " ");
		if(buf[i] == ' ') {
			ans.pop_back();
			ans += (mp[p] + "");
		} else {
			ans += (mp[p] + " ");
		}
	}
	while(ans.back() == ' ') ans.pop_back(); //吐掉末尾空格
}

signed main() {
#ifdef debug
	freopen("test.txt", "r", stdin);
	clock_t stime = clock();
#endif
	mp["A"] = ".-"; mp[".-"] = "A"; mp["B"] = "-..."; mp["-..."] = "B"; mp["C"] = "-.-."; mp["-.-."] = "C"; mp["D"] = "-.."; mp["-.."] = "D"; mp["E"] = "."; mp["."] = "E"; mp["F"] = "..-."; mp["..-."] = "F"; mp["G"] = "--."; mp["--."] = "G"; mp["H"] = "...."; mp["...."] = "H"; mp["I"] = ".."; mp[".."] = "I"; mp["J"] = ".---"; mp[".---"] = "J"; mp["K"] = "-.-"; mp["-.-"] = "K"; mp["L"] = ".-.."; mp[".-.."] = "L"; mp["M"] = "--"; mp["--"] = "M"; mp["N"] = "-."; mp["-."] = "N"; mp["O"] = "---"; mp["---"] = "O"; mp["P"] = ".--."; mp[".--."] = "P"; mp["Q"] = "--.-"; mp["--.-"] = "Q"; mp["R"] = ".-."; mp[".-."] = "R"; mp["S"] = "..."; mp["..."] = "S"; mp["T"] = "-"; mp["-"] = "T"; mp["U"] = "..-"; mp["..-"] = "U"; mp["V"] = "...-"; mp["...-"] = "V"; mp["W"] = ".--"; mp[".--"] = "W"; mp["X"] = "-..-"; mp["-..-"] = "X"; mp["Y"] =
"-.--"; mp["-.--"] = "Y"; mp["Z"] = "--.."; mp["--.."] = "Z"; mp["0"] = "-----"; mp["-----"] = "0"; mp["1"] = ".----"; mp[".----"] = "1"; mp["2"] = "..---"; mp["..---"] = "2"; mp["3"] = "...--"; mp["...--"] = "3"; mp["4"] = "....-"; mp["....-"] = "4"; mp["5"] = "....."; mp["....."] = "5"; mp["6"] = "-...."; mp["-...."] = "6"; mp["7"] = "--..."; mp["--..."] = "7"; mp["8"] = "---.."; mp["---.."] = "8"; mp["9"] = "----."; mp["----."] = "9";
#if 0
	//打表
	char x[128], y[128];
	while(~scanf("%s %s ", x, y)) {
		printf("mp[\"%s\"] = \"%s\"; ", x, y);
		printf("mp[\"%s\"] = \"%s\"; ", y, x);
	}
	return 0;
#endif

	scanf("%d ", &Q);

	while(Q--) {
		getline(cin, buf);
		// cout << buf << endl;
		string ans = "", key = "";
		if(buf[0]=='.' || buf[0]=='-')
			sloveA(ans, key);
		else 
			sloveB(ans, key);
		printf("%s\n", ans.data());
	}





#ifdef debug
	clock_t etime = clock();
#endif 
	return 0;
}




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值