题目很简单,意思也很明显。不过感觉这个题过的很顺,代码也还算简单。
#include <iostream> #include <cstdio> #include <cstring> #include <string> #include <vector> #include <map> #define pb push_back using namespace std; vector<char> vec[12]; struct Node { string s; int p; Node() {} Node (string _s, int _p) : s(_s), p(_p) {} }; vector<Node> dic; map<string, int> mp, mpp; map<string, int>::iterator it, itt; map< string, vector<Node> > res, ress; map< string, vector<Node> >::iterator it1; int n, m; void init() { for(int i = 0; i <= 9; i++) vec[i].clear(); vec[2].pb('A'), vec[2].pb('B'), vec[2].pb('C'); vec[3].pb('D'), vec[3].pb('E'), vec[3].pb('F'); vec[4].pb('G'), vec[4].pb('H'), vec[4].pb('I'); vec[5].pb('J'), vec[5].pb('K'), vec[5].pb('L'); vec[6].pb('M'), vec[6].pb('N'), vec[6].pb('O'); vec[7].pb('P'), vec[7].pb('Q'), vec[7].pb('R'), vec[7].pb('S'); vec[8].pb('T'), vec[8].pb('U'), vec[8].pb('V'); vec[9].pb('W'), vec[9].pb('X'), vec[9].pb('Y'), vec[9].pb('Z'); for(int i = 2; i <= 9; i++) { for(int j = 0; j < (int)vec[i].size(); j++) vec[i][j] += 32; } } string gao(int id, const string s) { int t = s[id] - '0'; mpp.clear(); ress.clear(); for(it = mp.begin(); it != mp.end(); it++) { string first = it->first; it1 = res.find(first); vector<Node> v = it1->second; for(int i = 0; i < (int)v.size(); i++) { for(int j = 0; j < (int)vec[t].size(); j++) { string tmp = first + vec[t][j]; if((int)v[i].s.size() > id && v[i].s[id] == vec[t][j]) { itt = mpp.find(tmp); if(itt == mpp.end()) { mpp[tmp] = v[i].p; vector<Node> vv; vv.clear(); vv.push_back(v[i]); ress[tmp] = vv; } else { int tt = itt->second; mpp.erase(itt); mpp[tmp] = v[i].p + tt; it1 = ress.find(tmp); vector<Node> vv = it1->second; ress.erase(it1); vv.push_back(v[i]); ress[tmp] = vv; } } } } } mp.clear(); res.clear(); for(it = mpp.begin(); it != mpp.end(); it++) mp[it->first] = it->second; for(it1 = ress.begin(); it1 != ress.end(); it1++) res[it1->first] = it1->second; int maxx = -1; string tmp = "MANUALLY"; for(it = mp.begin(); it != mp.end(); it++) { if(it->second > maxx) { maxx = it->second; tmp = it->first; } } return tmp; } int main() { int t; scanf("%d", &t); init(); int cas = 1; while(t--) { dic.clear(); printf("Scenario #%d:\n", cas++); scanf("%d", &n); string s; int p; for(int i = 0; i < n; i++) { cin >> s >> p; dic.push_back(Node(s, p)); } scanf("%d", &m); for(int i = 0; i < m; i++) { cin >> s; int len = s.size(); if(s[len - 1] == '1') len--; bool f = true; mp.clear(); res.clear(); for(int j = 0; j < len; j++) { string r = "MANUALLY"; if(j == 0) { mp[""] = 0; res[""] = dic; } if(f) r = gao(j, s); if(r == "MANUALLY") f = false; cout << r << endl; } puts(""); } puts(""); } return 0; }