Submission #761455

#TimeUsernameProblemLanguageResultExecution timeMemory
761455ksu2009enBrperm (RMI20_brperm)C++17
100 / 100
2323 ms51488 KiB
#include "brperm.h" #include <iostream> #include <vector> #include <string> #include <math.h> #include <cmath> #include <iomanip> #include <cstdio> #include <algorithm> #include <numeric> #include <map> #include <set> #include <queue> #include <stack> #include <deque> #include <bitset> #include <cstring> #include <unordered_map> using namespace std; typedef int ll; ll inv(ll n, ll sz){ string a; for(int i = sz - 1; i >= 0; i--){ if((n >> i) % 2 != 0) a += "1"; else a += "0"; } reverse(a.begin(), a.end()); ll c = sz - a.size(); for(int i = 0; i < c; i++) a += "0"; ll n2 = 0, j = 0; for(int i = sz - 1; i >= 0; i--){ if(a[j] == '1') n2 += (1 << i); j++; } return n2; } vector<pair<ll, ll>> d[20]; string a; ll mp[500007][20]; ll N; void init(int n, const char s[]) { N = n; for(int sz = 0; sz <= 19; sz++){ for(int i = 0; i < (1 << sz); i++){ if(inv(i, sz) > i){ d[sz].push_back({i, inv(i, sz)}); } } for(int i = 0; i <= n; i++) mp[i][sz] = -1; } for(int i = 0; i < n; i++) a.push_back(s[i]); return; } int query(int l, int k) { if(l + (1 << k) - 1 > N) return 0; if(mp[l][k] != -1) return mp[l][k]; for(auto i: d[k]){ if(a[l + i.first] != a[l + i.second]) return mp[l][k] = 0; } return mp[l][k] = 1; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...