結果
| 問題 |
No.775 tatyamと素数大富豪(hard)
|
| コンテスト | |
| ユーザー |
ei1333333
|
| 提出日時 | 2018-12-22 01:01:53 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 1,487 bytes |
| コンパイル時間 | 2,715 ms |
| コンパイル使用メモリ | 222,772 KB |
| 最終ジャッジ日時 | 2025-01-06 19:49:19 |
|
ジャッジサーバーID (参考情報) |
judge3 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 5 |
| other | AC * 9 WA * 1 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
int N, K;
int main() {
cin >> N >> K;
int Z = K;
vector< string > P(N);
for(int i = 0; i < N; i++) {
cin >> P[i];
}
vector< int > ord(N);
iota(begin(ord), end(ord), 0);
sort(begin(ord), end(ord), [&](const int &a, const int &b) {
if(P[a] + P[b] == P[b] + P[a]) return P[a].size() > P[b].size();
return P[a] + P[b] > P[b] + P[a];
});
string concat;
for(auto &p : ord) concat += P[p];
priority_queue< pair< string, vector< int > > > que;
que.emplace(concat, ord);
unordered_set< string > memo;
memo.emplace(concat);
auto normalize = [&](vector< int > v) {
for(int i = 1; i < v.size(); i++) {
for(int j = i; j > 0; j--) {
if(P[v[j]] + P[v[j - 1]] == P[v[j - 1]] + P[v[j]]) {
if(P[v[j]].size() > P[v[j - 1]].size()) {
swap(v[j], v[j - 1]);
} else {
break;
}
}
}
}
return v;
};
while(que.size() && K > 0) {
auto p = que.top().second;
cout << que.top().first << endl;
--K;
que.pop();
for(int i = 0; i < ord.size(); i++) {
for(int j = i - 1; j >= 0; j--) {
if(P[p[i]] + P[p[j]] >= P[p[j]] + P[p[i]]) continue;
swap(p[i], p[j]);
string con;
for(auto &q : p) con += P[q];
if(memo.count(con)) continue;
memo.emplace(con);
que.emplace(con, normalize(p));
swap(p[i], p[j]);
break;
}
}
}
}
ei1333333