結果

問題 No.3418 【絶望】30個並列ごちゃ混ぜHit&Blowで遊ぼう!
コンテスト
ユーザー butsurizuki
提出日時 2025-12-05 21:55:30
言語 C++23
(gcc 13.3.0 + boost 1.89.0)
結果
RE  
実行時間 -
コード長 4,047 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 6,640 ms
コンパイル使用メモリ 321,072 KB
実行使用メモリ 29,836 KB
スコア 0
平均クエリ数 7.58
最終ジャッジ日時 2025-12-24 23:35:26
合計ジャッジ時間 54,499 ms
ジャッジサーバーID
(参考情報)
judge5 / judge1
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
other RE * 100
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

#include<bits/stdc++.h>

using namespace std;

bool check(string s){
  sort(s.begin(),s.end());
  for(int i=1;i<s.size();i++){
    if(s[i-1]==s[i]){return false;}
  }
  return true;
}

using pi=pair<int,int>;

vector<int> ask(string s){
  cout << s << "\n";
  fflush(stdout);
  vector<pi> res(30);
  vector<int> rv;
  for(int i=0;i<30;i++){
    cin >> res[i].first >> res[i].second;
    rv.push_back(res[i].first*6+res[i].second);
  }
  // cerr << "done\n";
  if(res[0].first==5 || res[0].first<0){exit(0);} // finish
  return rv;
}

int hbc(string s,string t){
  int res=0;
  for(int k=0;k<5;k++){
    if(s[k]==t[k]){res+=6;}
  }
  for(int k=0;k<5;k++){
    for(int l=0;l<5;l++){
      if(k==l){continue;}
      if(s[k]==t[l]){res++;}
    }
  }
  return res;
}

typedef struct{
  string q;
  vector<int> rem;
  vector<vector<int>> v;
}his;

vector<int> alive;
vector<string> slis;
map<string,int> sinv;

queue<int> dead_q;

vector<vector<double>> prbs;
vector<double> prb;

vector<his> hv;

void incl(string s){
  int sid=sinv[s];
  for(int i=0;i<hv.size();i++){
    int tg=hbc(s,hv[i].q);
    int p=0;
    for(int j=0;j<hv[i].v[tg].size();j++){
      if(hv[i].v[tg][j]==sid){p=j; break;}
    }
    swap(hv[i].v[tg][p],hv[i].v[tg].back());
    hv[i].v[tg].pop_back();
    hv[i].rem[tg]--;
    if(hv[i].v[tg].empty()){continue;}
    
    if(hv[i].rem[tg]==0){
      for(auto &nx : hv[i].v[tg]){
        if(alive[nx]){
          alive[nx]=0;
          dead_q.push(nx);
        }
      }
    }
    else{
      double app=hv[i].rem[tg];
      app/=hv[i].v[tg].size();
      for(auto &nx : hv[i].v[tg]){
        prbs[i][nx]=app;
      }
    }
  }
}

void excl(string s){
  int sid=sinv[s];
  for(int i=0;i<hv.size();i++){
    int tg=hbc(s,hv[i].q);
    int p=0;
    for(int j=0;j<hv[i].v[tg].size();j++){
      if(hv[i].v[tg][j]==sid){p=j; break;}
    }
    swap(hv[i].v[tg][p],hv[i].v[tg].back());
    hv[i].v[tg].pop_back();
    if(hv[i].v[tg].empty()){continue;}

    double app=hv[i].rem[tg];
    app/=hv[i].v[tg].size();
    for(auto &nx : hv[i].v[tg]){
      prbs[i][nx]=app;
    }
  }
}

int main(){
  vector<int> remp(32,0);
  vector<vector<int>> vemp(32);

  for(int i=0;i<=99999;i++){
    int v=i;
    string cur;
    for(int j=0;j<5;j++){
      cur.push_back('0'+v%10);
      v/=10;
    }
    reverse(cur.begin(),cur.end());
    if(check(cur)){
      sinv[cur]=slis.size();
      slis.push_back(cur);
      alive.push_back(1);
    }
  }

  prb.resize(slis.size());
  vector<double> prb_ini;
  for(int i=0;i<slis.size();i++){
    prb[i]=0.0;
    prb_ini.push_back(prb[i]);
  }

  int pac=0;
  for(int cq=0;;cq++){
    string q;
    if(cq==0){q="01234";}
    else{
      int bi=-1,bj=-1;
      for(int i=0;i<prbs.size();i++){
        for(int j=0;j<slis.size();j++){
          if(alive[j]){
            if(bi==-1){bi=i; bj=j;}
            if(prbs[bi][bj]<prbs[i][j]){bi=i; bj=j;}
          }
        }
      }
      q=slis[bj];
    }

    auto ar=ask(q);
    int ac=0;
    for(auto &nx : ar){
      if(nx==30){ac++;}
    }
    if(pac!=ac){
      if(alive[sinv[q]]){
        alive[sinv[q]]=0;
        incl(q);
      }
    }
    else{
      if(alive[sinv[q]]){
        alive[sinv[q]]=0;
        excl(q);
      }
    }
    pac=ac;

    his cur;
    cur.q=q;
    cur.rem=remp;
    cur.v=vemp;
    for(auto &nx : ar){
      if(nx<30){cur.rem[nx]++;}
    }
    for(int i=0;i<slis.size();i++){
      if(alive[i]){
        int tg=hbc(q,slis[i]);
        cur.v[tg].push_back(i);
      }
    }

    prbs.push_back(prb_ini);
    for(int i=0;i<30;i++){
      if(cur.v[i].size()==0){continue;}
      if(cur.rem[i]==0){
        for(auto &nx : cur.v[i]){
          if(alive[nx]){
            alive[nx]=0;
            dead_q.push(nx);
          }
        }
      }
      else{
        double app=cur.rem[i];
        app/=cur.v[i].size();
        for(auto &nx : cur.v[i]){
          prbs[cq][nx]=app;
        }
      }
    }
    hv.push_back(cur);

    while(!dead_q.empty()){
      auto od=dead_q.front();
      dead_q.pop();
      excl(slis[od]);
    }
  }
}
0