usaco-4.3.4-lgame
2011-04-09 17:16
281 查看
这个题以前看到了都不敢做,就停了几个月做usaco,重新做的时候发现这个题好像并不难.
我是把每个单词都排序,然后用字典树存起来,然后对输入的单词同样对其排序,这样就会比较容易找到只有一个单词构成的最优解.在这个过程中同时找出可能用于二个单词的最优解的单词.然后就是遍历所有可能找出最大值.
我是把每个单词都排序,然后用字典树存起来,然后对输入的单词同样对其排序,这样就会比较容易找到只有一个单词构成的最优解.在这个过程中同时找出可能用于二个单词的最优解的单词.然后就是遍历所有可能找出最大值.
/* ID: mnlm1991 PROG: lgame LANG: C++ */ #include<cstdio> #include<cstdlib> #include<cmath> #include<cstring> #include<vector> #include<algorithm> #include<string> #include<map> #include<set> #include<bitset> #include<queue> #include<stack> #include<iostream> #include<iterator> using namespace std; const int MaxN = 40001; int ch[] = { 2, 5, 4, 4, 1, 6, 5, 5, 1, 7, 6, 3, 5, 2, 3, 5, 7, 2, 1, 2, 4, 6, 6, 7, 5, 7 }; vector <string> ans; vector <string> s; vector <pair <int, int> > ians; vector <int> iians; int v[MaxN]; int value; struct DicTree { int next[26]; vector <int> str; DicTree() { memset(next, -1, sizeof(next)); str.clear(); } }; DicTree node[50000]; int nodecnt; const int root = 0; bool visited[50000]; void Init() { nodecnt = 1; } string stmp; string sstmp; int len; void DFS(string::iterator it, int p) { if (!node[p].str.empty()) { if (v[*node[p].str.begin()] > value) { value = v[*node[p].str.begin()]; ians.clear(); ians.push_back(make_pair(p, -1)); } else if (v[*node[p].str.begin()] == value) { ians.push_back(make_pair(p, -1)); } if (len - s[*node[p].str.begin()].size() > 2) { if (!visited[p]) { visited[p] = true; iians.push_back(p); } } } for (; it != stmp.end(); it++) { if (node[p].next[*it - 'a'] != -1) { DFS(it + 1, node[p].next[*it - 'a']); } } return; } bool Test(string s1, string s2) { if (s1.size() > s2.size()) { return false; } sort(s1.begin(), s1.end()); string::iterator it1, it2; for (it1 = s1.begin(), it2 = s2.begin(); it1 != s1.end() && it2 != s2.end(); ) { if (*it1 == * it2) { it1++; it2++; } else if (*it1 > *it2) { it2++; } else { return false; } } return it1 == s1.end(); } int main() { Init(); freopen("lgame.dict", "r", stdin); int p; int i = 0; while (cin >> stmp, stmp[0] != '.') { s.push_back(stmp); sort(stmp.begin(), stmp.end()); p = root; v[i] = 0; string::iterator it; for (it = stmp.begin(); it != stmp.end(); it++) { v[i] += ch[*it - 'a']; if (node[p].next[*it - 'a'] == -1) { node[p].next[*it - 'a'] = nodecnt++; } p = node[p].next[*it - 'a']; } node[p].str.push_back(i); i++; } freopen("lgame.in", "r", stdin); freopen("lgame.out", "w", stdout); value = 0; while (cin >> stmp) { len = stmp.size(); sort(stmp.begin(), stmp.end()); memset(visited, 0, sizeof(visited)); DFS(stmp.begin(), root); vector <int>::iterator viti, vitj; for (viti = iians.begin(); viti != iians.end(); viti++) { for (vitj = viti; vitj != iians.end(); vitj++) { sstmp = s[node[*viti].str[0]] + s[node[*vitj].str[0]]; if (Test(sstmp, stmp)) { if (v[node[*viti].str[0]] + v[node[*vitj].str[0]] > value) { value = v[node[*viti].str[0]] + v[node[*vitj].str[0]]; ians.clear(); ians.push_back(make_pair(*viti, *vitj)); } else if (v[node[*viti].str[0]] + v[node[*vitj].str[0]] == value) { ians.push_back(make_pair(*viti, *vitj)); } } } } vector <pair <int, int> >::iterator vpit; for (vpit = ians.begin(); vpit != ians.end(); vpit++) { if (vpit ->second == -1) { for (viti = node[vpit->first].str.begin(); viti != node[vpit->first].str.end(); viti++) { ans.push_back(s[*viti]); } } else { for (viti = node[vpit->first].str.begin(); viti != node[vpit->first].str.end(); viti++) { for (vitj = node[vpit->second].str.begin(); vitj != node[vpit->second].str.end(); vitj++) { if (s[*viti] < s[*vitj]) { ans.push_back(s[*viti] + " " + s[*vitj]); } else { ans.push_back(s[*vitj] + " " + s[*viti]); } } } } } cout << value << endl; sort(ans.begin(), ans.end()); vector <string>::iterator vsit; for (vsit = ans.begin(); vsit != ans.end(); vsit++) { if (vsit == ans.begin() || *vsit != * (vsit - 1)) { cout << *vsit << endl; } } } }
相关文章推荐
- usaco training 4.3.4 Letter Game 题解
- [USACO4.3.4 Letter Game]
- USACO 4.3.4 Letter Game 字母游戏 题解与分析
- usaco 4.3.4 Letter Game
- USACO4.3.3 Letter Game (lgame)
- usaco 4.3.4 Street Race
- usaco-4.3-lgame-passed
- usaco 4.3.4 letter game
- USACO4.3.3 Letter Game (lgame)
- usaco-lgame
- win7下安装JIRA4.3.4安装、破解
- BZOJ1770 : [Usaco2009 Nov]lights 燈
- bzoj 1603: [Usaco2008 Oct]打谷机(拆点并查集)
- USACO 1.3 Prime Cryptarithm
- USACO Section 2.2 Party Lamps
- [USACO 07NOV]Cow Relays
- USACO 1.2 transform
- bzoj:1661 [Usaco2006 Nov]Big Square 巨大正方形
- [USACO15DEC]最大流Max Flow
- usaco 2008 jan bronze