Submission #755962

#TimeUsernameProblemLanguageResultExecution timeMemory
755962vjudge1Password (RMI18_password)C++17
100 / 100
316 ms712 KiB
#include<bits/stdc++.h>
#include<ext/pb_ds/assoc_container.hpp>
using namespace std;
using namespace __gnu_pbds;

typedef long long ll;
typedef tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update> indexed_set;
const ll MOD = 1e9 + 7;
ll mod(ll x, ll m = MOD){return (x + m) % m;}

typedef vector<int> vi;
typedef vector<ll> vll;
typedef pair<ll,ll> pll;

typedef vector<pair<int,int>> vpi;

#define pb push_back

#define ff first
#define ss second
#define all(x) (x).begin(),(x).end()

int n, s, k = 1;
int occ[64], rem[64];
string cur = "";
int query(string str);
string guess(int n, int s);
/*

string STR;
int query(string t)
{
    int cur = 0;
    for(int i =0; i < n; i++)
    {
        if(t[cur] == STR[i])
            cur++;
    }
    return cur;
}
*/

int compare(int a, int b)
{
    if(rem[a] <= 0)
        return b;
    if(rem[b] <= 0)
        return a;
    string t= cur;
    t += (char) ('a' + a);
    for(int u = 0; u < rem[b]; u++)
        t += (char)('a' + b);
    //cout << (char)('a' + a) << ' ' << (char)('a' +b) << ' ' << rem[a] << ' ' << rem[b] << '\n';
    if(query(t) == (int)(t.length()))
        return a;
    else
        return b;
}
vi st;
void build(int p, int l, int r)
{
    if(l == r)
    {
        st[p] = l;
        return ;
    }
    build(2 * p, l, (l  + r)/2);
    build(2 * p + 1, (l + r)/2 + 1, r);
    st[p] = compare(st[2 * p], st[2 * p + 1]);
    return ;
}
void update(int i)
{
    i += k;
    i /= 2;
    while(i)
    {
        st[i] = compare(st[2 * i], st[2 * i + 1]);
        i /= 2;
    }
}
string guess(int N, int S)
{
    n = N, s = S;
    while(k < s)
        k = (k << 1);
    st.assign(2 * k + 1, 0);
    for(int l = 0; l < s; l++)
    {
        string t=  "";
        for(int i = 0; i < N; i++)
            t += (char)('a' + l);
        occ[l] = query(t);
        rem[l] = occ[l];
        if(occ[l] == N)
            return t;
    }
    build(1, 0, k - 1);
    for(int i = 0; i < N; i++)
    {
        cur += (char)('a' + st[1]);
        rem[st[1]]--;
        update(st[1]);
    }
    return cur;
}
/*
int32_t main()
{
    ios::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
    int N, S;
    cin >> N >> S;
    cin >> STR;
    cout << guess(N, S);

}
*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...