Submission #1338425

#TimeUsernameProblemLanguageResultExecution timeMemory
1338425SmuggingSpunPassword (RMI18_password)C++17
30 / 100
57 ms428 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((s = _s) == 1){
    return string(_n, 'a');
  }
	if((n = _n) <= s || (n <= 100 && s <= 4)){
		return sub12::solve();
	}
  if(n <= 3500){
    return sub34::solve();
  }
  return sub5::solve();
}
#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...