Submission #1338852

#TimeUsernameProblemLanguageResultExecution timeMemory
1338852SmuggingSpunPassword (RMI18_password)C++20
100 / 100
161 ms552 KiB
// #include<bits/stdc++.h>
// using namespace std;
// int query(string q);
// int n, s;
// namespace sub12{
//   string solve(){
//     string ans = "";
// 		for(int i = 0, bef = 0; i < n; i++){
// 			for(int j = 0; j <= i; j++){
// 				for(int k = 0; k < s; k++){
// 					string candidate = "";
// 					for(int t = 0; t < j; t++){
// 						candidate += ans[t];
// 					}
// 					candidate += char('a' + k);
// 					for(int t = j; t < i; t++){
// 						candidate += ans[t];
// 					}
// 					if(query(candidate) > bef){
// 						bef++;
// 						ans = candidate;
// 						j = i;
// 						break;
// 					} 
// 				}
// 			}
// 		}
// 		return ans;
//   }
// }
// namespace sub34{
//   string solve(){
//     vector<int>cnt(s), ord(s);
//     for(int i = 0; i + 1 < s; i++){
//       cnt[ord[i] = i] = query(string(n, 'a' + i));
//     }
//     cnt[ord[s - 1] = s - 1] = n - accumulate(cnt.begin(), prev(cnt.end()), 0);
//     sort(ord.begin(), ord.end(), [&] (int i, int j){
//       return cnt[i] < cnt[j];
//     });
//     string ans = "";
//     for(int& c : ord){
//       vector<int>f(ans.size(), 0);
//       for(int p = 0; p < ans.size() && cnt[c] > 0; p++){
//         f[p] = cnt[c];
//         for(int k = 1, exp = ans.size(); k <= cnt[c]; k++){
//           string temp = ans.substr(0, p) + string(k, 'a' + c) + ans.substr(p, int(ans.size()) - p);
//           if(query(temp) != ++exp){
//             f[p] = k - 1;
//             break;
//           }
//         }
//         cnt[c] -= f[p];
//       }
//       string nans = "";
//       for(int p = 0; p < ans.size(); nans += ans[p++]){
//         nans += string(f[p], 'a' + c);
//       }
//       swap(ans, nans);
//       ans += string(cnt[c], 'a' + c);
//     }
//     return ans;
//   }
// }
// namespace sub5{
//   vector<int>cnt, ord;
//   string small_solve(vector<int>ord){
//     string ans = "";
//     for(int& c : ord){
//       vector<int>f(ans.size(), 0);
//       for(int p = 0; p < ans.size() && cnt[c] > 0; p++){
//         f[p] = cnt[c];
//         for(int k = 1, exp = ans.size(); k <= cnt[c]; k++){
//           string temp = ans.substr(0, p) + string(k, 'a' + c) + ans.substr(p, int(ans.size()) - p);
//           if(query(temp) != ++exp){
//             f[p] = k - 1;
//             break;
//           }
//         }
//         cnt[c] -= f[p];
//       }
//       string nans = "";
//       for(int p = 0; p < ans.size(); nans += ans[p++]){
//         nans += string(f[p], 'a' + c);
//       }
//       swap(ans, nans);
//       ans += string(cnt[c], 'a' + c);
//     }
//     return ans;
//   }
//   string solve(){
//     cnt.resize(s);
//     ord.resize(s);
//     for(int i = 0; i + 1 < s; i++){
//       cnt[ord[i] = i] = query(string(n, 'a' + i));
//     }
//     cnt[ord[s - 1] = s - 1] = n - accumulate(cnt.begin(), prev(cnt.end()), 0);
//     sort(ord.begin(), ord.end(), [&] (int i, int j){
//       return cnt[i] < cnt[j];
//     });
//     vector<int>part;
//     for(int i = 0; i < s; i += 2){
//       part.push_back(ord[i]);
//     }
//     string ans = small_solve(part);
//     part.clear();
//     for(int i = 1; i < s; i += 2){
//       part.push_back(ord[i]);
//     }
//     string other = small_solve(part);
//     int i = 0;
//     for(int p = 0; p < ans.size(); p++){
//       for(; i < other.size(); i++, p++){
//         string next_ans = ans.substr(0, p) + other[i] + ans.substr(p, int(ans.size()) - p);
//         if(query(next_ans) != next_ans.size()){
//           break;
//         }
//         swap(ans, next_ans);
//       }
//     }
//     while(i < other.size()){
//       ans += other[i++];
//     }
//     return ans;
//   }
// }
// string guess(int _n, int _s){
// 	if((n = _n) <= (s = _s) || (n <= 100 && s <= 4)){
// 		return sub12::solve();
// 	}
//   if(n <= 3500){
//     return sub34::solve();
//   }
//   return sub5::solve();
// }
#include <bits/stdc++.h>
using namespace std;

int query(string str);

string guess(int n, int s) {
    vector<string> all;
    for(int i = 0; i < s; ++i){
        string cur(n, i + 'a');
        int len = query(cur);
        if(len) all.push_back(string(len, i + 'a'));
    }
    auto solve = [&](auto &self, vector<string> cur) -> string {
        if((int) cur.size() == 0) return "";
        if((int) cur.size() == 1) return cur[0];
        int mid = (int) cur.size() / 2;
        vector<string> left, right;
        for(int i = 0; i < mid; ++i) left.push_back(cur[i]);
        for(int i = mid; i < (int) cur.size(); ++i) right.push_back(cur[i]);
        string X = self(self, left), Y = self(self, right);
        if((int) X.size() == 0) return Y;
        if((int) Y.size() == 0) return X;
        string res = X;
        int where = 0;
        for(auto v : Y){
            while(1) {
                string working = "";
                for(int j = 0; j < (int) res.size(); ++j){
                    if(j == where) working.push_back(v);
                    working.push_back(res[j]);
                }
                if(where == (int) res.size()) working.push_back(v);
                where += 1;
                if(query(working) == (int) working.size()){
                    res = working;
                    break;
                }
            }
        }
        //cout << "combining: " << X << " with " << Y << " after combining: " << res << "\n";
        return res;
    };
    return solve(solve, all);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...