# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
494377 | jasen_penchev | Brperm (RMI20_brperm) | C++14 | 1355 ms | 13620 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include "brperm.h"
#include <iostream>
#include <string>
#define endl '\n'
using namespace std;
const int LOG = 20;
const int MAXN = 500000;
string str = "";
int diff[MAXN + 5];
int mem[LOG + 5][(1ll << LOG) + 5];
void init(int n, const char s[])
{
for (int i = 0; i < n; ++ i)
{
str += s[i];
}
for (int k = 0; k < 20; ++ k)
{
for (int i = 0; i < (1ll << k); ++ i)
{
int idx = 0;
for (int j = 0; j < k; ++ j)
{
if ((i & (1ll << j))) idx += (1ll << (k - j - 1));
}
mem[k][i] = idx;
}
}
diff[n - 1] = n;
for (int i = n - 2; i >= 0; -- i)
{
if (s[i] == s[i + 1]) diff[i] = diff[i + 1];
else diff[i] = i + 1;
}
return;
}
int query(int pos, int k)
{
if (pos + (1ll << k) > str.size()) return 0;
if (pos + (1ll << k) <= diff[pos]) return 1;
for (int i = 0; i < (1ll << k); ++ i)
{
int idx = mem[k][i];
if (str[pos + i] != str[pos + idx]) return 0;
}
return 1;
}
Compilation message (stderr)
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |