题解:CF1292E Rin and The Unknown Flower
Rin and The Unknown Flower
挺有意思的一道构造题。
首先
当
若没问出,再问
若问完
最后实现时可以将一些类似的操作合并,枚举的时候即使是重复的也不用管,因为不会超过最坏情况。然后询问,回答,以及枚举情况的部分写成函数。这样代码就会简单很多。对于有的题解里说代码超过
Code
#include <bits/stdc++.h>
#define pb push_back
#define eb emplace_back
#define sz(x) ((int)x.size())
#define vi vector <int>
#define L(i, j, k) for (int i=(j); i<=(k); ++i)
using namespace std;
string c; int n; vector <string> tmp;
vi ask(string s) {
cout<<"? "<<s<<endl; int cnt; cin>>cnt; vi tmp;
while (cnt--) { int x; cin>>x; tmp.eb(x-1); L(i, 0, sz(s)-1) c[x-1+i]=s[i]; }
return tmp;
}
void submit(string s) { cout<<"! "<<s<<endl; }
void ttry() {
L(i, 0, sz(tmp)-2) if (!ask(tmp[i]).empty()) return submit(tmp[i]);
submit(tmp[sz(tmp)-1]);
}
void sub1() {
ask("CC"); ask("CH"); ask("CO"); ask("HO"); ask("OO");
L(i, 1, n-2) if (!c[i]) c[i]='H';
bool f1=!c[0], f2=!c[n-1];
if (f1) c[0]='O'; if (f2) c[n-1]='C'; tmp.eb(c);
if (f1) c[0]='O'; if (f2) c[n-1]='H'; tmp.eb(c);
if (f1) c[0]='H'; if (f2) c[n-1]='C'; tmp.eb(c);
if (f1) c[0]='H'; if (f2) c[n-1]='H'; tmp.eb(c);
ttry();
}
void sub2() {
ask("CC"); ask("CH"); ask("CO"); ask("HO");
if (c[0]||c[1]||c[2]||c[3]) {
int p1=0, p2=0; while (c[p1]&&p1<3) ++p1;
p2=p1+1; while (c[p2]&&p2<3) ++p2; if (p2==4) p2=3;
c[p1]='O', c[p2]='C'; tmp.eb(c);
c[p1]='O', c[p2]='H'; tmp.eb(c);
c[p1]='O', c[p2]='O'; tmp.eb(c);
c[p1]='H', c[p2]='C'; tmp.eb(c);
c[p1]='H', c[p2]='H'; tmp.eb(c);
c[p1]='H', c[p2]='O'; tmp.eb(c);
return ttry();
}
vi rec=ask("OO");
if (!rec.empty()) {
if (!c[2]) c[2]='H';
if (c[3]) return submit(c);
c[3]='C'; tmp.eb(c);
c[3]='H'; tmp.eb(c);
return ttry();
}
c[1]=c[2]='H', c[0]='O', c[3]='C';
ask("HHH"); submit(c);
}
signed main() {
int T; cin>>T;
while (T--) {
cin>>n; string().swap(c); vector <string> ().swap(tmp); L(i, 1, n) c.pb(0);
if (n>4) sub1(); else sub2();
int res; cin>>res; if (res) cout<<endl; else return 0;
}
}