답안 #1119121

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1119121 2024-11-26T16:10:33 Z somefolk Password (RMI18_password) C++14
30 / 100
297 ms 956 KB
#include <iostream>
#include <cmath>
#include <algorithm>
#include <string>
#include <vector>
#include <map>
#include <unordered_map>
#include <queue>
#include <set>
#include <unordered_set>
#include <complex>
#include <list>
#include <chrono>
#include <random>
#include <stack>
#include <iomanip>
#include <fstream>
#include <cassert>
using namespace std;
 
#define endl "\n"
// #define int long long
 
const int INF = 2 * 1e5 + 5;
const int MOD = 1e9 + 7;
 
int query(string s);
 
string guess(int n, int s){
    vector<char> a;
    unordered_map<char, int> mp;
    unordered_map<char, char> adj;
    for(char i = 'a'; i < 'a'+s; i++){
        int amount = query(string(n, i));
        if(amount != 0){
            a.push_back(i);
            mp[i] = amount;
        }
    }
 
    string sol = "";
    for(int i = 0; i < n; i++){
        // randomize:
        random_device rd;
        mt19937 g(rd());
        shuffle(a.begin(), a.end(), g);
 
        // get edeges between letters:
        if(i == 0 || a.size() > 1){
            char prev = a[0];
            for(auto &j : a){
                if(prev == j) continue;
                if(query(sol + j + string(mp[prev], prev)) == sol.size() +  mp[prev] + 1){
                    adj[prev] = j;
                    prev = j;
                } else {
                    adj[j] = prev;
                }
            }
        }
 
        // dfs for last
        char end = a[0];
        while(true){
            if(adj.count(end) == 0) break;
            end = adj[end];
        }
 
        sol+=end;
        mp[end]--;
 
        // erase last and all edges to last
        vector<char> dis;
        if(mp[end]) dis.push_back(end);
        for(auto it = adj.begin(); it != adj.end();){
            if(it->second == end){
                dis.push_back(it->first);
                it = adj.erase(it);
            } else {
                it++;
            }
        }
 
        a.clear();
        a = dis;
    }
 
    return sol;
}

Compilation message

password.cpp: In function 'std::string guess(int, int)':
password.cpp:53:60: warning: comparison of integer expressions of different signedness: 'int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   53 |                 if(query(sol + j + string(mp[prev], prev)) == sol.size() +  mp[prev] + 1){
      |                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 336 KB Guessed the password with 75 queries.
2 Correct 4 ms 336 KB Guessed the password with 156 queries.
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 336 KB Guessed the password with 49 queries.
2 Runtime error 5 ms 448 KB Execution killed with signal 13
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 84 ms 712 KB Guessed the password with 3786 queries.
2 Correct 124 ms 708 KB Guessed the password with 5074 queries.
3 Correct 170 ms 956 KB Guessed the password with 7492 queries.
4 Correct 297 ms 700 KB Guessed the password with 12153 queries.
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 336 KB Guessed the password with 75 queries.
2 Correct 4 ms 336 KB Guessed the password with 156 queries.
3 Correct 3 ms 336 KB Guessed the password with 49 queries.
4 Runtime error 5 ms 448 KB Execution killed with signal 13
5 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 336 KB Guessed the password with 75 queries.
2 Correct 4 ms 336 KB Guessed the password with 156 queries.
3 Correct 3 ms 336 KB Guessed the password with 49 queries.
4 Runtime error 5 ms 448 KB Execution killed with signal 13
5 Halted 0 ms 0 KB -