Submission #858070

# Submission time Handle Problem Language Result Execution time Memory
858070 2023-10-07T11:32:57 Z boris_mihov Brperm (RMI20_brperm) C++17
50 / 100
354 ms 262144 KB
#include "brperm.h"
#include <algorithm>
#include <iostream>
#include <numeric>
#include <cassert>
#include <vector>

typedef long long llong;
const int MAXN = 500000 + 10;
const int MOD = 998244353;
const int MAXLOG = 19;

int n;
char s1[MAXN];
int base[3 * MAXN];

int encode(int logLen, int logH)
{
    int res = 0;
    for (int i = 0 ; i < logLen ; ++i)
    {
        res += MAXLOG - i;
    }

    return res + logH;
}

struct Sparse
{
    int normalHash[MAXN][MAXLOG];
    int danceHash[MAXN][MAXLOG * (MAXLOG + 1) / 2];

    void build()
    {
        for (int i = 0 ; i < n ; ++i)
        {
            normalHash[i][0] = s1[i] - 'a' + 1;
            for (int lgH = 0 ; lgH < MAXLOG ; ++lgH)
            {
                danceHash[i][encode(0, lgH)] = s1[i] - 'a' + 1;
            }
        }

        for (int lgLen = 1 ; (1 << lgLen) <= n ; ++lgLen)
        {
            for (int i = 0 ; i + (1 << lgLen) <= n ; ++i)
            {
                normalHash[i][lgLen] = (1LL * base[(1 << (lgLen - 1))] * normalHash[i][(lgLen - 1)] + 1LL * normalHash[i + (1 << (lgLen - 1))][(lgLen - 1)]) % MOD;
                for (int lgH = 0 ; lgH < MAXLOG - lgLen ; ++lgH)
                {
                    danceHash[i][encode(lgLen, lgH)] = (1LL * base[1 << lgH] * danceHash[i][encode(lgLen - 1, lgH + 1)] + 1LL * danceHash[i + (1 << (lgLen - 1))][encode(lgLen - 1, lgH + 1)]) % MOD;
                }
            }        
        }
    }

    int query(int idx, int log)
    {
        if ((idx + (1 << log)) > n) return 0;
        return normalHash[idx][log] == danceHash[idx][encode(log, 0)];
    }
};

Sparse sparse;
void init(int N, const char S[]) 
{
    n = N;
    for (int i = 0 ; i < n ; ++i)
    {
        s1[i] = S[i];
    }

    base[0] = 1;
    for (int i = 1 ; i < 3 * MAXN ; ++i)
    {
        base[i] = (27LL * base[i - 1]) % MOD;
    }

    sparse.build();
}

int query(int idx, int log) 
{
    return sparse.query(idx, log);
}
# Verdict Execution time Memory Grader output
1 Correct 9 ms 8796 KB Output is correct
2 Correct 9 ms 8928 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 9 ms 8796 KB Output is correct
2 Correct 9 ms 8928 KB Output is correct
3 Correct 346 ms 91472 KB Output is correct
4 Correct 354 ms 91312 KB Output is correct
5 Correct 352 ms 91480 KB Output is correct
# Verdict Execution time Memory Grader output
1 Runtime error 41 ms 262144 KB Execution killed with signal 9
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 9 ms 8796 KB Output is correct
2 Correct 9 ms 8928 KB Output is correct
3 Correct 346 ms 91472 KB Output is correct
4 Correct 354 ms 91312 KB Output is correct
5 Correct 352 ms 91480 KB Output is correct
6 Runtime error 41 ms 262144 KB Execution killed with signal 9
7 Halted 0 ms 0 KB -