用DFS可以搞定,不会超时,不过时间上不是很理想,要660ms,看别人的时间都比较少,不知道用什么算法写的。。感觉DFS+回溯已经被我写烂了,核心算法一气呵成,哈哈
#include<iostream>
#include<string>
#include<vector>
#include<sstream>
#include<set>
#include<cstring>
using namespace std;
namespace
{
set<string> words;
int src[26];
vector<string> dict;
string line;
vector<string> stack;
bool match(const string &s)
{
int temp[26];
memset(temp, 0, sizeof(temp));
for (size_t i = 0; i < s.size(); i++)
temp[s[i] - 'A']++;
for (int i = 0; i < 26; i++)
if (temp[i] && temp[i] > src[i])
return false;
return true;
}
void forward(const string &s)
{
for (size_t i = 0; i < s.size(); i++)
src[s[i] - 'A']--;
}
void back(const string &s)
{
for (size_t i = 0; i < s.size(); i++)
src[s[i] - 'A']++;
}
bool find()
{
for (int i = 0; i < 26; i++)
if (src[i])
return false;
return true;
}
void dfs()
{
if (find())
{
cout << line << " =";
for (size_t i = 0; i < stack.size(); i++)
cout << " " << stack[i];
cout << endl;
return;
}
for (size_t i = 0; i < dict.size(); i++)
if (stack.empty() || (!stack.empty() && dict[i] > stack.back()))
if (words.find(dict[i]) == words.end() && match(dict[i]))
{
forward(dict[i]);
stack.push_back(dict[i]);
dfs();
stack.pop_back();
back(dict[i]);
}
}
}
int main()
{
string word;
while (cin >> word, word != "#")
dict.push_back(word);
cin >> ws;
while (getline(cin, line), line != "#")
{
words.clear();
istringstream ism(line);
while (ism >> word)
words.insert(word);
memset(src, 0, sizeof(src));
for (size_t i = 0; i < line.size(); i++)
if (line[i] >= 'A' && line[i] <= 'Z')
src[line[i] - 'A']++;
stack.clear();
dfs();
}
return 0;
}