Submission #1333047

#TimeUsernameProblemLanguageResultExecution timeMemory
1333047SmuggingSpunMartian DNA (IOI16_dna)C++20
100 / 100
9 ms344 KiB
#include "dna.h"
#include<bits/stdc++.h>
using namespace std;
int n;
namespace sub1{
  string solve(){
    for(int mask = 1; mask < (1 << n); mask++){
      string s = "";
      for(int i = 0; i < n; i++){
        s += char((mask >> i & 1) + 48);
      }
      if(make_test(s)){
        return s;
      }
    }
    return string(n, '0');
  }
}
namespace sub2{
  string solve(){
    string s = "";
    while(s.size() < n){
      s += '0';
      if(!make_test(s)){
        s.pop_back();
        break;
      }
    }
    if(s.empty() || s.size() == n){
      return string(n, '0' + s.empty());
    }
    bool z = true;
    while(s.size() < n){
      s += char('0' + z);
      if(!make_test(s)){
        s.pop_back();
        s += char('0' + (z = !z));
        if(!make_test(s)){
          s.pop_back();
          break;
        }
      }
    }
    z = true;
    while(s.size() < n){
      s = char('0' + z) + s;
      if(!make_test(s)){
        s[0] = '0' + (z = !z);
      }
    }
    return s;
  }
}
namespace sub3{
  string solve(){
    int low = 1, high = n, max_zero = 0, cnt_zero = 0;
    while(low <= high){
      int mid = (low + high) >> 1;
      if(make_test(string(mid, '0'))){
        low = (max_zero = mid) + 1;
      }
      else{
        high = mid - 1;
      }
    }
    if(max_zero == 0 || max_zero == n){
      return string(n, '0' + (max_zero == 0));
    }
    string s = string(max_zero, '0');
    while(true){
      if(!make_test(s += '1')){
        s.back() = '0';
        cnt_zero++;
      }
      else{
        cnt_zero = 0;
      }
      if(cnt_zero + max_zero >= n || cnt_zero > max_zero){
        break;
      }
    }
    high = max_zero;
    s = s.substr(low = 0, int(s.size()) - cnt_zero);
    cnt_zero = 0;
    while(low <= high){
      int mid = (low + high) >> 1;
      if(make_test(s + string(mid, '0'))){
        low = (cnt_zero = mid) + 1;
      }
      else{
        high = mid - 1;
      }
    }
    s += string(cnt_zero, '0');
    while(s.size() < n){
      s = '0' + s;
      if(!make_test(s)){
        s[0] = '1';
      }
    }
    return s;
  }
}
string analyse(int _n, int t){
  n = _n;
  if(t == 31){
    return sub1::solve();
  }
  if(t == 256){
    return sub2::solve();
  }
  return sub3::solve();
}                       
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...