Submission #1310334

#TimeUsernameProblemLanguageResultExecution timeMemory
1310334ycled_t12Combo (IOI18_combo)C++17
Compilation error
0 ms0 KiB
// Ready-to-submit implementation for IOI 2018 - Combo // If you want to test locally, compile with -DLOCAL #include <bits/stdc++.h> using namespace std; #ifdef LOCAL // --- Local simulator for testing --- // Define a press() that reads the secret S from stdin (first line) and simulates judge. static string SECRET; static int PRESS_COUNT = 0; int press(const string &p) { ++PRESS_COUNT; // longest prefix of SECRET that appears as a substring of p int N = (int)SECRET.size(); int best = 0; for (int len = 0; len <= N; ++len) { string pref = SECRET.substr(0, len); if (pref.empty()) { best = max(best, 0); continue; } if ((int)pref.size() > (int)p.size()) break; if (p.find(pref) != string::npos) best = max(best, len); } return best; } string guess_sequence(int N); int main() { if (!getline(cin, SECRET)) return 0; // trim newline while (!SECRET.empty() && (SECRET.back() == '\r' || SECRET.back() == '\n')) SECRET.pop_back(); int N = (int)SECRET.size(); string ans = guess_sequence(N); cerr << "press calls: " << PRESS_COUNT << "\n"; cout << ans << "\n"; return 0; } #else // In judge/submission environment the header provides press(string). // Uncomment the next line if your judge requires #include "combo.h" // #include "combo.h" // declare press to satisfy compiler (the real one is provided by grader) extern int press(const string &p); string guess_sequence(int N); #endif // --- Implementation of the editorial algorithm --- string guess_sequence(int N) { string s = ""; // 1) determine first character with up to 3 presses // try "AB" to detect whether first char is A/B or X/Y int r = press(string("AB")); if (r > 0) { // first char is A or B int r2 = press(string("A")); if (r2 > 0) s = "A"; else s = "B"; } else { // first char is X or Y int r2 = press(string("X")); if (r2 > 0) s = "X"; else s = "Y"; } if (N == 1) return s; // prepare the three other letters (in order p1, p2, p3) vector<char> all = {'A','B','X','Y'}; char f = s[0]; vector<char> p; for (char c : all) if (c != f) p.push_back(c); // p[0], p[1], p[2] are the three candidates in some fixed order // 2) determine positions 2..N-1 (1-based indexing) using the concatenation trick // loop i from 2 to N-1 (inclusive). At loop start s.length() == i-1. for (int i = 2; i <= N-1; ++i) { // construct query string exactly as in the editorial: // G = s + p1 + s + (p2 + p1) + s + (p2 + p2) + s + (p2 + p3) // (characters p1/p2/p3 correspond to p[0],p[1],p[2]) string G; G.reserve(4 * s.size() + 6); G += s; G.push_back(p[0]); G += s; G.push_back(p[1]); G.push_back(p[0]); G += s; G.push_back(p[1]); G.push_back(p[1]); G += s; G.push_back(p[1]); G.push_back(p[2]); int coins = press(G); // coins is the length of the longest prefix of SECRET that appears in G. // At this stage s.size() == i-1. if (coins == i) { // next char is p1 s.push_back(p[0]); } else if (coins == i-1) { // next char is p3 s.push_back(p[2]); } else { // otherwise next char is p2 s.push_back(p[1]); } } // 3) determine last character (position N) using up to 2 presses // Try s + p1; if returns N then p1 is last character; else try p2; otherwise p3. if ((int)s.size() < N) { string G = s; G.push_back(p[0]); int coins = press(G); if (coins == N) { s.push_back(p[0]); } else { G = s; G.push_back(p[1]); coins = press(G); if (coins == N) s.push_back(p[1]); else s.push_back(p[2]); } } return s; }

Compilation message (stderr)

/usr/bin/ld: /tmp/ccNGpkCa.o: in function `guess_sequence[abi:cxx11](int)':
combo.cpp:(.text+0x7f): undefined reference to `press(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
/usr/bin/ld: combo.cpp:(.text+0xca): undefined reference to `press(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
/usr/bin/ld: combo.cpp:(.text+0x3dc): undefined reference to `press(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
/usr/bin/ld: combo.cpp:(.text+0x784): undefined reference to `press(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
/usr/bin/ld: combo.cpp:(.text+0x7e5): undefined reference to `press(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
/usr/bin/ld: /tmp/ccNGpkCa.o:combo.cpp:(.text+0x86a): more undefined references to `press(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)' follow
collect2: error: ld returned 1 exit status