QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#169792#7187. Hardcore String Countingopen your brain (Zhi Zhang, Yanru Guan, Jianfeng Zhu)#AC ✓673ms11812kbC++173.1kb2023-09-09 14:02:532023-09-09 14:02:53

Judging History

This is the latest submission verdict.

  • [2023-09-09 14:02:53]
  • Judged
  • Verdict: AC
  • Time: 673ms
  • Memory: 11812kb
  • [2023-09-09 14:02:53]
  • Submitted

answer

#include <bits/stdc++.h>

using namespace std;

const int o = 18, len = 1 << o, mod = 998244353, N = 100005;
int n, m, kmp[N], b[N];
char a[N];

int power(int a, int n) {
    int tp = 1;
    while (n) {
        if (n & 1) {
            tp = 1ll * tp * a % mod;
        }
        a = 1ll * a * a % mod, n >>= 1;
    }
    return tp;
}

namespace poly {
typedef unsigned long long u64;
int w[len], r[len], up, l;

void init() {
    const int w1 = power(3, (mod - 1) >> o);
    w[len >> 1] = 1;
    for (int i = (len >> 1) + 1; i != len; i++) {
        w[i] = 1ll * w[i - 1] * w1 % mod;
    }
    for (int i = (len >> 1) - 1; i; i--) {
        w[i] = w[i << 1];
    }

    for (int i = 0; i != len; i++) {
        r[i] = (r[i >> 1] >> 1) | ((i & 1) << (o - 1));
    }
}

int pre(int n) {
    l = 32 - __builtin_clz(n);
    return up = 1 << l;
}

void ntt(int *a, int n, bool op) {
    static u64 t[len];

    for (int i = 0; i != n; i += 2) {
        int x = a[r[i] >> (o - l)], y = a[r[i + 1] >> (o - l)];
        t[i] = x + y, t[i + 1] = x + mod - y;
    }

    for (int l = 2; l != n; l <<= 1) {
        int *k = w + l;
        for (u64 *f = t; f != t + n; f += l) {
            for (int *j = k; j != k + l; j++, f++) {
                u64 x = *f, y = f[l] * *j % mod;
                f[l] = x + mod - y, *f += y;
            }
        }
    }

    if (op) {
        for (int i = 0, x = mod - ((mod - 1) >> l); i != n; i++) {
            a[i] = t[i] % mod * x % mod;
        }
        reverse(a + 1, a + n);
    } else {
        for (int i = 0; i != n; i++) {
            a[i] = t[i] % mod;
        }
    }
}
}

int calc(int n, int m) {
    static int f[len], g[len], h[len];

    f[0] = 1, memcpy(g, b, (n + 1) << 2);

    while (m) {
        int up = poly::pre(2 * n);
        memcpy(h, g, (n + 1) << 2);
        for (int i = 1; i <= n; i += 2) {
            h[i] = (mod - h[i]) % mod;
        }

        poly::ntt(f, up, 0), poly::ntt(g, up, 0), poly::ntt(h, up, 0);
        for (int i = 0; i != up; i++) {
            f[i] = 1ll * f[i] * h[i] % mod;
            g[i] = 1ll * g[i] * h[i] % mod;
        }
        memset(h, 0, up << 2);
        poly::ntt(f, up, 1), poly::ntt(g, up, 1);

        for (int i = 1; i <= n; i++) {
            g[i] = g[i << 1];
        }
        fill(g + n + 1, g + up, 0);

        bool o = m & 1;
        for (int i = 0; i <= n; i++) {
            f[i] = f[i << 1 | o];
        }
        fill(f + n + 1, f + up, 0);

        m >>= 1;
    }

    return f[0];
}

int main() {
    poly::init();
    cin >> n >> m, m -= n;
    cin >> (a + 1);

    for (int i = 2, j = 0; i <= n; i++) {
        while (j && a[j + 1] != a[i]) {
            j = kmp[j];
        }
        if (a[j + 1] == a[i]) {
            j++;
        }

        kmp[i] = j;
    }

    for (int i = kmp[n]; i; i = kmp[i]) {
        b[n - i] = 1;
    }
    b[0] = 1;

    b[n] = 1;
    for (int i = n; i; i--) {
        b[i] = (b[i] + (mod - 26ll) * b[i - 1]) % mod;
    }

    cout << calc(n, m) << endl;
}

这程序好像有点Bug,我给组数据试试?

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 0ms
memory: 9644kb

input:

6 7
aaaaaa

output:

25

result:

ok answer is '25'

Test #2:

score: 0
Accepted
time: 1ms
memory: 11344kb

input:

3 5
aba

output:

675

result:

ok answer is '675'

Test #3:

score: 0
Accepted
time: 3ms
memory: 9228kb

input:

1 1
a

output:

1

result:

ok answer is '1'

Test #4:

score: 0
Accepted
time: 3ms
memory: 9648kb

input:

5 7
ababa

output:

675

result:

ok answer is '675'

Test #5:

score: 0
Accepted
time: 4ms
memory: 11048kb

input:

1 3
a

output:

625

result:

ok answer is '625'

Test #6:

score: 0
Accepted
time: 1ms
memory: 10860kb

input:

10 536870912
njjnttnjjn

output:

826157401

result:

ok answer is '826157401'

Test #7:

score: 0
Accepted
time: 253ms
memory: 10676kb

input:

65535 536870912
aaaoaaaoaaaoaaayaaaoaaaoaaaoaaayaaaoaaaoaaaoaaayaaaoaaaoaaaoaaaeaaaoaaaoaaaoaaayaaaoaaaoaaaoaaayaaaoaaaoaaaoaaayaaaoaaaoaaaoaaaeaaaoaaaoaaaoaaayaaaoaaaoaaaoaaayaaaoaaaoaaaoaaayaaaoaaaoaaaoaaaeaaaoaaaoaaaoaaayaaaoaaaoaaaoaaayaaaoaaaoaaaoaaayaaaoaaaoaaaoaaaraaaoaaaoaaaoaaayaaaoaaaoaaao...

output:

996824286

result:

ok answer is '996824286'

Test #8:

score: 0
Accepted
time: 545ms
memory: 11808kb

input:

99892 536870912
wwwwbwwwwbwwwwqwwwwbwwwwbwwwwqwwwwbwwwwbwwwweewwwwbwwwwbwwwwqwwwwbwwwwbwwwwqwwwwbwwwwbwwwweewwwwbwwwwbwwwwqwwwwbwwwwbwwwwqwwwwbwwwwbwwwwawwwwbwwwwbwwwwqwwwwbwwwwbwwwwqwwwwbwwwwbwwwweewwwwbwwwwbwwwwqwwwwbwwwwbwwwwqwwwwbwwwwbwwwweewwwwbwwwwbwwwwqwwwwbwwwwbwwwwqwwwwbwwwwbwwwwawwwwbwwwwb...

output:

718505966

result:

ok answer is '718505966'

Test #9:

score: 0
Accepted
time: 582ms
memory: 11688kb

input:

100000 536870912
rrmrrqrrmrrcrrmrrqrrmrrbrrmrrqrrmrrcrrmrrqrrmrrnnrrmrrqrrmrrcrrmrrqrrmrrbrrmrrqrrmrrcrrmrrqrrmrrttrrmrrqrrmrrcrrmrrqrrmrrbrrmrrqrrmrrcrrmrrqrrmrrnnrrmrrqrrmrrcrrmrrqrrmrrbrrmrrqrrmrrcrrmrrqrrmrrarrmrrqrrmrrcrrmrrqrrmrrbrrmrrqrrmrrcrrmrrqrrmrrnnrrmrrqrrmrrcrrmrrqrrmrrbrrmrrqrrmrrcrrm...

output:

824845147

result:

ok answer is '824845147'

Test #10:

score: 0
Accepted
time: 673ms
memory: 11696kb

input:

99892 1000000000
ggggjggggjggggxggggjggggjggggxggggjggggjggggeeggggjggggjggggxggggjggggjggggxggggjggggjggggeeggggjggggjggggxggggjggggjggggxggggjggggjggggbggggjggggjggggxggggjggggjggggxggggjggggjggggeeggggjggggjggggxggggjggggjggggxggggjggggjggggeeggggjggggjggggxggggjggggjggggxggggjggggjggggbggggjgggg...

output:

971128221

result:

ok answer is '971128221'

Test #11:

score: 0
Accepted
time: 584ms
memory: 11804kb

input:

100000 625346716
kwfuguxrbiwlvyqsbujelgcafpsnxsgefwxqoeeiwoolreyxvaahagoibdrznebsgelthdzqwxcdglvbpawhdgaxpiyjglzhiamhtptsyyzyyhzjvnqfyqhnrtbwgeyotmltodidutmyvzfqfctnqugmrdtuyiyttgcsjeupuuygwqrzfibxhaefmbtzfhvopmtwwycopheuacgwibxlsjpupdmchvzneodwuzzteqlzlfizpleildqqpcuiechcwearxlvplatyrzxfochdfjqcmzt...

output:

0

result:

ok answer is '0'

Test #12:

score: 0
Accepted
time: 596ms
memory: 11748kb

input:

65536 35420792
pkmyknsqmhwuevibxjgrftrinkulizarxbkmgorddvuvtrhdadnlxfrxsyqhueuefdkanysaixmhbdqyskjdrzntlaqtwoscxldmyzahzwximvjgsjuddejbsbwtxgkbzfzdusucccohjwjuaasnkindxjjtxdbxmitcixrcmawdezafgnigghdtoyzazyfedzsuwsrlkdtarcmzqnszgnyiqvzamjtamvfrhzucdsfscyzdbvbxutwraktnmfrdfbejcbhjcgczgwiucklwydmuuozlu...

output:

0

result:

ok answer is '0'

Test #13:

score: 0
Accepted
time: 608ms
memory: 11760kb

input:

100000 1000000000
nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn...

output:

545362217

result:

ok answer is '545362217'

Test #14:

score: 0
Accepted
time: 551ms
memory: 11688kb

input:

100000 536870911
ggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg...

output:

332737929

result:

ok answer is '332737929'

Test #15:

score: 0
Accepted
time: 537ms
memory: 11696kb

input:

100000 536870911
qodtwstdnykduvzvvvzmpawqaajvcdatuzzjisoezaqtvqhghmixvlfyhznvrlhdslyyhxoqchflfdjiefikpfrykekhjqywxpwmihiojcfzcmqelrkddbpkcnqcaopdyhldawyrvkqfbqpybewrtusifbfdtxiflxtkzdjqbocozdpupunehraytkhqnobhzeohkvbjyrdfebstqfjlvrcabimlybsnuaqgfcldvklwnyuywvfpdqwmortctexzaufmazyatybltglyonllufofiyr...

output:

592710827

result:

ok answer is '592710827'

Test #16:

score: 0
Accepted
time: 1ms
memory: 9016kb

input:

100000 100000
ciawhxojdqnivfonswbklnoocigwmkbjtkzahqgysihfdeqhialusobeeazqaqzryakqycapfswxpithldpuiflxzpgsysjwnpinfubqlyadphswzvzbrxcdbbhavtzkvwrcqecfnzawisgkvsopjnfzfnlecuesnffqzcknunwsxlrbvdzqbduypfrwgqqnrjstxgjaeuqxxajfbmidkwhrgkpjduftivfwnuugxomyznpbtbcstdkdaitvpdtuvyzipygztosvjwwdascbqthqdgkbit...

output:

1

result:

ok answer is '1'

Test #17:

score: 0
Accepted
time: 572ms
memory: 11812kb

input:

100000 1000000000
zujpixywgppdzqtwikoyhvlwqvxrfdylopuqgprrqpgqmgfkmhbucwkgdljyfzzbtaxxnltmbptwhknjjqlbeuiowdblqppqeeuunexkghdxjtbidlacmycgwvulgaeazyiwzedaxhtskacflodouylwxfjydzfbthotdwrfcpwrkcgnxpjsmkafaaojlctmqckabidgalvptziemzphncrgtqxlvllgwwgkoqxwhziuxvkadgaohdlceuggwwzmpywsgoecwwhhbotaleesjexdxg...

output:

879141501

result:

ok answer is '879141501'

Extra Test:

score: 0
Extra Test Passed