USACO 4.3 Letter Game (暴力)
2015-03-26 21:12:35
思路:暴力模拟... 由于题目单词的长度限制在了3~7,所以就算多个单词凑起来也最多只能2个。
根据这个重要的推断,我们只要暴力枚举1个 / 2个凑在一起即可。
1 /* 2 ID:naturec1 3 PROG: lgame 4 LANG: C++ 5 */ 6 #include <cstdio> 7 #include <cstring> 8 #include <cstdlib> 9 #include <cmath> 10 #include <vector> 11 #include <map> 12 #include <set> 13 #include <stack> 14 #include <queue> 15 #include <string> 16 #include <fstream> 17 #include <iostream> 18 #include <algorithm> 19 using namespace std; 20 21 #define MEM(a,b) memset(a,b,sizeof(a)) 22 #define REP(i,n) for(int i=1;i<=(n);++i) 23 #define REV(i,n) for(int i=(n);i>=1;--i) 24 #define FOR(i,a,b) for(int i=(a);i<=(b);++i) 25 #define RFOR(i,a,b) for(int i=(a);i>=(b);--i) 26 #define getmid(l,r) ((l) + ((r) - (l)) / 2) 27 #define MP(a,b) make_pair(a,b) 28 #define X first 29 #define Y second 30 31 typedef long long ll; 32 typedef pair<int,int> pii; 33 const int INF = (1 << 30) - 1; 34 35 string s[40000]; 36 int scnt = 0; 37 38 void Read(){ 39 ifstream fin("lgame.dict"); 40 while(getline(fin,s[scnt++])){ 41 if(s[scnt - 1][0] == '.') 42 break; 43 } 44 fin.close(); 45 } 46 47 int val[200],num[200]; 48 vector<pair<string,int> > g; 49 string str; 50 51 struct node{ 52 string a,b; 53 int val; 54 node() {} 55 node(string ta,string tb,int tval) : 56 a(ta) , b(tb) , val(tval) {} 57 }; 58 59 vector<node> ans; 60 61 bool cmp(node a,node b){ 62 return a.a < b.a; 63 } 64 65 int main(){ 66 Read(); 67 freopen("lgame.in","r",stdin); 68 freopen("lgame.out","w",stdout); 69 val['e'] = val['i'] = val['s'] = 1; 70 val['r'] = val['t'] = val['a'] = val['n'] = 2; 71 val['o'] = val['l'] = 3; 72 val['u'] = val['d'] = val['c'] = 4; 73 val['y'] = val['p'] = val['g'] = val['h'] = val['b'] = val['m'] = 5; 74 val['w'] = val['f'] = val['k'] = val['v'] = 6; 75 val['q'] = val['j'] = val['z'] = val['x'] = 7; 76 cin >> str; 77 for(int i = 0; i < str.size(); ++i) 78 num[str[i]]++; 79 int cur,len,tnum[200],val_max = 0; 80 bool flag; 81 for(int i = 0; i < scnt; ++i){ 82 len = s[i].size(); 83 MEM(tnum,0); 84 flag = true; 85 cur = 0; 86 for(int j = 0; j < len; ++j){ 87 tnum[s[i][j]]++; 88 cur += val[s[i][j]]; 89 if(tnum[s[i][j]] > num[s[i][j]]){ 90 flag = false; 91 break; 92 } 93 } 94 if(flag){ 95 g.push_back(MP(s[i],cur)); 96 val_max = max(val_max,cur); 97 } 98 } 99 int l1,l2; 100 int tnum2[200]; 101 for(int i = 0; i < g.size(); ++i){ 102 l1 = g[i].X.size(); 103 MEM(tnum,0); 104 for(int j = 0; j < l1; ++j) 105 tnum[g[i].X[j]]++; 106 for(int j = i + 1; j < g.size(); ++j){ 107 memcpy(tnum2,tnum,sizeof(tnum)); 108 flag = true; 109 l2 = g[j].X.size(); 110 for(int k = 0; k < l2; ++k){ 111 tnum2[g[j].X[k]]++; 112 if(tnum2[g[j].X[k]] > num[g[j].X[k]]){ 113 flag = false; 114 break; 115 } 116 } 117 if(flag){ 118 ans.push_back(node(g[i].X,g[j].X,g[i].Y + g[j].Y)); 119 val_max = max(val_max,g[i].Y + g[j].Y); 120 } 121 } 122 } 123 printf("%d\n",val_max); 124 for(int i = 0; i < g.size(); ++i) if(g[i].Y == val_max) 125 ans.push_back(node(g[i].X,"",g[i].Y)); 126 sort(ans.begin(),ans.end(),cmp); 127 for(int i = 0; i < ans.size(); ++i) if(ans[i].val == val_max){ 128 cout << ans[i].a; 129 if(ans[i].b.size()) cout << " " << ans[i].b; 130 puts(""); 131 } 132 return 0; 133 }