Here is my code. When compiling using g++ 12.1.0 on my local machine or using GNU G++ 20 on the judging machine, it always stop the input after the first loop of the first loop. Like it showns here. With the debug code below, it output something like 5 ? 1 1 > g 1- ? 2 1 2 > 2 ? 1 2 > u 1- ! gu???
where lines start with >
is my input.
But when compiling with Clang++ on my local machine or on judge machine, it works well.
P.S. please ignore the WA on clang++, it is caused by making too many queries, which can be solved using binary search but I've not implement that yet.
Dbg Code: ```
include <bits/stdc++.h>
using namespace std;
define endl "\n"
pragma GCC optimize(3, "Ofast", "inline")
typedef vector vi; const int INF = 2e9;
define yesnosolve cout << (solve() ? "NO" : "YES") << endl
char q1(int pos) { char c; cout << "? 1 " << pos + 1 << endl << flush; scanf("%s", &c); return c; }
int q2(int pos1, int pos2) { int ans; cout << "? 2 " << pos1 + 1 << ' ' << pos2 + 1 << endl << flush; cin >> ans; return ans; }
void solve() { int len; cin >> len; vector res(len, '?');
res[0] = q1(0);
// cerr << res[0] << endl
// << flush;
// cerr << len << '-' << endl;
for (int i = 1; i < len; i++)
{
cerr << i << '-' << endl;
set<char> st;
bool f = false;
for (int j = i - 1; j >= 0; j--)
{
st.insert(res[j]);
if (q2(j, i) == int(st.size()))
{
res[i] = res[j];
f = true;
break;
}
}
if (!f)
res[i] = q1(i);
cerr << i << '-' << endl;
}
cout << "! ";
for (auto &a : res)
cout << a;
cout << endl
<< flush;
}
int main() { // cin.tie(nullptr); // cout.tie(nullptr); // ios_base::sync_with_stdio(0);
// int T;
// cin >> T;
// while (T--)
solve();
return 0;
} ```
Полный текст и комментарии »