您的位置:首页 > 其它

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;
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: