zoj 1481 Namenum

逆向思维
先将输入的字典翻译为数字
然后在按照输入的数字进行查找
用map

#include<iostream>
#include<map>
#include<cstring>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;

map<char, char> dic;
map<string, vector<string>> ans;
void inti() {
	int i, j;
	char ap = 'A';
	for (i = 2; i <= 9; i++) {
		for (j = 0; j <= 2; j++) {
			if (i == 7 && j == 1)ap++;
			dic[char(ap + j)] = i + '0';
			dic[char(ap + j + 32)] = i + '0';
		}
		ap += 3;
	}

	dic['Q'] = '0';
	dic['q'] = '0';
	dic['Z'] = '0';
	dic['z'] = '0';

}

bool isvalid(string name) {
	for (int i = 0; i < name.size(); i++) {
		if (!((name[i] >= 'A' && name[i] <= 'Z') || (name[i] >= 'a' && name[i] <= 'z'))) {
			return false;
		}
	}
	return true;
}

int main() {
	inti();
	string name, num;
	int i;
	while (cin >> name && name != "#") {
		num = "";
//		if (!isvalid(name))continue;
		for (i = 0; i < name.size(); i++) {
			num += dic[name[i]];
		}
		ans[num].push_back(name);
	}

	map<string, vector<string>>::iterator it = ans.begin();
	for (; it != ans.end(); it++) {
		sort(it->second.begin(), it->second.end());
	}

	while (cin >> num) {
		if (ans.find(num) != ans.end()) {
			cout << ans[num][0];
			for (i = 1; i < ans[num].size(); i++) {
				cout << " " << ans[num][i];
			}
		} else {
			printf("NONE");
		}
		printf("\n");
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值