POJ-1051, LiveArchive-2282, TJU-1558, ZOJ-1068 : P,MTHBGWB

問題概要

モールス信号を使った簡単な暗号をデコードする問題。

解法

ルールに従って実装するだけ。

acceptされたコード

大昔に書いたもの

#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <climits>
#include <cfloat>
#include <map>
#include <utility>
#include <set>
#include <iostream>
#include <memory>
#include <string>
#include <vector>
#include <algorithm>
#include <functional>
#include <sstream>
#include <complex>
#include <stack>
#include <queue>
#include <numeric>
#include <iomanip>

#define REP(i,n) for(i=0; i < (n); i++)
#define REPONE(i, n) for(i=1; i <= (n); i++)
#define ITER(c) __typeof((c).begin())
#define EACH(c,it) for(ITER(c) it =(c).begin(); it!=(c).end(); it++)
#define SZ(c) ((int) (c).size())
#define ALL(c) c.begin(), c.end()
#define SUM(c) accumulate(ALL(c), 0)
#define EXIST(c,v) (find(ALL(c), (v)) != (c).end())
#define PB push_back
#define MP make_pair

using namespace std;
static const double EPS = 1e-9;
static const double PI = 3.141592653589793238462643383279;
typedef long long ll;

template<class T> char search(T st, T end, string tar) {
	for(T it=st; it!=end; it++){
		if(it->second == tar) return it->first;
	}
	return 0;
}

int main(){
	map<char, string> dict;
	dict['A'] = ".-";
	dict['B'] = "-...";
	dict['C'] = "-.-.";
	dict['D'] = "-..";
	dict['E'] = ".";
	dict['F'] = "..-.";
	dict['G'] = "--.";
	dict['H'] = "....";
	dict['I'] = "..";
	dict['J'] = ".---";
	dict['K'] = "-.-";
	dict['L'] = ".-..";
	dict['M'] = "--";
	dict['N'] = "-.";
	dict['O'] = "---";
	dict['P'] = ".--.";
	dict['Q'] = "--.-";
	dict['R'] = ".-.";
	dict['S'] = "...";
	dict['T'] = "-";
	dict['U'] = "..-";
	dict['V'] = "...-";
	dict['W'] = ".--";
	dict['X'] = "-..-";
	dict['Y'] = "-.--";
	dict['Z'] = "--..";
	dict['_'] = "..--";
	dict[','] = ".-.-";
	dict['.'] = "---.";
	dict['?'] = "----";

	int n;
	cin >> n;
	int i, j, cur;
	vector<int> nums;
	string line, ans;
	string enc;
	REPONE(i,n){
		nums.clear();
		enc = "";
		cin >> line;

		REP(j,SZ(line)){
			enc = enc + dict[line[j]];
			nums.PB(SZ(dict[line[j]]));
		}

		reverse(ALL(nums));
		ans = "";
		cur = 0;
		REP(j,SZ(nums)){
			ans = ans + string(1,search(ALL(dict),enc.substr(cur, nums[j])));
			cur += nums[j];
		}
		cout << i << ": " << ans << endl;
	}

	return 0;
}