# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
709222 | hmm789 | Password (RMI18_password) | C++14 | 0 ms | 0 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
using namespace std;
#define int long long
string guess(int n, int s) {
int cnt = 1;
string ans = "";
pair<int, int> occ[s];
for(int i = 0; i < s; i++) {
int l = 1, r = n+1;
while(l < r) {
int m = (l+r)/2;
string s;
for(int j = 0; j < m; j++) s += (char)('a'+i);
//~ cout << "q" << cnt << ": " << s << endl;
if(query(s) == m) l = m+1;
else r = m;
}
occ[i].first = l-1;
occ[i].second = i;
//~ cout << "a " << i << " " << l-1 << endl;
}
sort(occ, occ+s);
for(int i = 0; i < occ[0].first; i++) ans += (char)('a'+occ[0].second);
for(int i = 1; i < s; i++) {
//~ cout << "s" << i << ": " << ans << endl;
int tmpcnt[ans.size()+1], sm = 0;
memset(tmpcnt, 0, sizeof(tmpcnt));
for(int j = ans.size(); j >= 0; j--) {
int l = sm+1, r = occ[i].first+1;
while(l < r) {
int m = (l+r)/2;
string tmp = "";
for(int k = 0; k < j; k++) tmp += ans[k];
for(int k = 0; k < m; k++) tmp += (char)('a'+occ[i].second);
if(query(tmp) == tmp.size()) l = m+1;
else r = m;
}
tmpcnt[j] = l-1-sm;
sm += l-1-sm;
}
string tmp = "";
for(int j = 0; j < ans.size(); j++) tmp += ans[j];
//~ cout << "s" << i << ": " << tmp << endl;
ans = "";
for(int j = 0; j < tmpcnt[0]; j++) ans += (char)('a'+occ[i].second);
for(int j = 1; j <= tmp.size(); j++) {
//~ cout << "s" << i << "(" << j << "): " << ans << endl;
ans += tmp[j-1];
for(int k = 0; k < tmpcnt[j]; k++) ans += (char)('a'+occ[i].second);
}
//~ cout << "s" << i << ": " << ans << endl;
}
return ans;
}