QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#586095#9244. Counting Stringsucup-team4435AC ✓1371ms19308kbC++205.6kb2024-09-24 02:29:272024-09-24 02:29:27

Judging History

你现在查看的是最新测评结果

  • [2024-09-24 02:29:27]
  • 评测
  • 测评结果:AC
  • 用时:1371ms
  • 内存:19308kb
  • [2024-09-24 02:29:27]
  • 提交

answer

#ifndef LOCAL
#pragma GCC optimize("Ofast,unroll-loops")
#endif

#include <bits/stdc++.h>
using namespace std;

using ll = long long;
using ld = long double;

#define all(a) begin(a), end(a)
#define len(a) int((a).size())

struct suffix_array {
    std::vector<int> order, suffix_position, lcp;

    template<typename T>
    suffix_array(T str = T()) {
        str.push_back(*std::min_element(str.begin(), str.end()) - 1);
        int n = str.size();

        order.resize(n);
        std::iota(order.begin(), order.end(), 0);
        std::sort(order.begin(), order.end(), [&](const int i, const int j) {
            return str[i] < str[j];
        });

        suffix_position.resize(n);
        for (int i = 0; i < n; i++)
            suffix_position[order[i]] = i == 0 ? 0 : suffix_position[order[i - 1]] + (str[order[i]] != str[order[i - 1]]);

        std::vector<int> ptr(n), new_order(n), new_suffix_position(n);
        for (int len = 1; suffix_position[order.back()] != n - 1; len <<= 1) {
            std::fill(ptr.begin(), ptr.begin() + suffix_position[order.back()] + 1, 0);
            for (int i = 0; i < n; i++)
                if (suffix_position[i] + 1 < n)
                    ptr[suffix_position[i] + 1]++;

            for (int i = 1; i <= suffix_position[order.back()]; i++)
                ptr[i] += ptr[i - 1];

            for (const int position : order) {
                int suffix = (position - len + n) % n;
                new_order[ptr[suffix_position[suffix]]++] = suffix;
            }
            std::swap(order, new_order);

            for (int i = 0; i < n; i++)
                new_suffix_position[order[i]] = i == 0 ? 0 : new_suffix_position[order[i - 1]]
                + (suffix_position[order[i]] != suffix_position[order[i - 1]]
                || suffix_position[(order[i] + len) % n] != suffix_position[(order[i - 1] + len) % n]);

            std::swap(suffix_position, new_suffix_position);
        }
        assert(order[0] == n - 1);

        lcp.resize(n);
        int current_lcp = 0;
        for (int suffix = 0; suffix < n - 1; suffix++, current_lcp = current_lcp == 0 ? 0 : current_lcp - 1) {
            int previous_suffix = order[suffix_position[suffix] - 1];
            while (str[suffix + current_lcp] == str[previous_suffix + current_lcp])
                current_lcp++;

            lcp[suffix_position[suffix]] = current_lcp;
        }
    }
};

constexpr int N = 1e5 + 228;
constexpr int STEP = 20;
constexpr int BLOCKS = N / STEP + 1;
constexpr int MASK = 1 << STEP;
int ppc[MASK], prec[MASK];

void precalc() {
    for (int mask = 0; mask < MASK; mask++) {
        ppc[mask] = __builtin_popcount(mask);
        for (int i = 0; i < STEP; i++) {
            if (mask >> i & 1) {
                prec[mask] += i + 1;
            }
        }
    }
}

struct custom_bitset {
    int block[BLOCKS];

    custom_bitset(int ones = 0) {
        memset(block, 0, sizeof(block));
        int pos = 0;
        while (pos + STEP <= ones) {
            block[pos / STEP] = (1 << STEP) - 1;
            pos += STEP;
        }
        while (pos < ones) {
            set(pos, 1);
            pos++;
        }
    }

    void set_and(const custom_bitset &other) {
        for (int i = 0; i < BLOCKS; i++) {
            block[i] &= other.block[i];
        }
    }

    void set_or(const custom_bitset &other) {
        for (int i = 0; i < BLOCKS; i++) {
            block[i] |= other.block[i];
        }
    }

    void set(int pos, int val) {
        int id = pos / STEP;
        int rel = pos % STEP;
        if (val == 1) {
            block[id] |= 1 << rel;
        } else {
            block[id] &= ~(1 << rel);
        }
    }

    int get(int i) {
        int id = i / STEP;
        int rel = i % STEP;
        return block[id] >> rel & 1;
    }

    ll solve() {
        ll ans = 0;
        for (int i = 0; i < BLOCKS; i++) {
            ans += 1ll * ppc[block[i]] * (i * STEP) + prec[block[i]];
        }
        // for (int i = 0; i < N; i++) {
        //     if (get(i)) {
        //         ans += i + 1;
        //     }
        // }
        return ans;
    }
};

int main() {
    cin.tie(nullptr)->sync_with_stdio(false);
    precalc();

    int n;
    string s;
    cin >> n >> s;
    suffix_array sa(s);

    int B = 1;
    while (B * B <= n) {
        B++;
    }

    vector<int> sieve(B);
    iota(all(sieve), 0);
    vector<custom_bitset> coprime(B);
    for (int x = 2; x < B; x++) {
        if (sieve[x] != x) {
            continue;
        }
        for (int y = x; y < B; y += x) {
            sieve[y] = min(sieve[y], x);
        }
        coprime[x] = custom_bitset(n);
        for (int i = 0; i < n; i += x) {
            coprime[x].set(i, 0);
        }
    }

    custom_bitset killed;

    ll ans = 0;
    for (int i = 1; i <= n; i++) {
        killed.set_and(custom_bitset(sa.lcp[i]));

        int left = sa.order[i] + 1;
        custom_bitset cpr(n - left + 1);
        for (int x = 2; x < B; x++) {
            if (left % x != 0) {
                continue;
            }
            cpr.set_and(coprime[x]);
            while (left % x == 0) {
                left /= x;
            }
        }
        if (left > 1) {
            for (int x = 0; x < n - left + 1; x += left) {
                cpr.set(x, 0);
            }
        }

        auto prev = cpr;
        ans += cpr.solve();
        cpr.set_and(killed);
        ans -= cpr.solve();
        killed.set_or(prev);
    }
    cout << ans << '\n';
}

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

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 71ms
memory: 11876kb

input:

4
abca

output:

14

result:

ok answer is '14'

Test #2:

score: 0
Accepted
time: 71ms
memory: 11788kb

input:

1
a

output:

1

result:

ok answer is '1'

Test #3:

score: 0
Accepted
time: 59ms
memory: 11844kb

input:

2
aa

output:

3

result:

ok answer is '3'

Test #4:

score: 0
Accepted
time: 71ms
memory: 12136kb

input:

2
ab

output:

3

result:

ok answer is '3'

Test #5:

score: 0
Accepted
time: 72ms
memory: 11840kb

input:

100
xgljgljgljjljjjjljtjljtgljgljgljjljjjjljtjljtjljgljljgljgljjljjjjljtjljtjljgljllljgllgljgljjglljgljl

output:

101808

result:

ok answer is '101808'

Test #6:

score: 0
Accepted
time: 72ms
memory: 11820kb

input:

100
ilhliaiehaiehldgeieieedveldgeaeaehldgeldgeiiedeiaiehaiehldgeieieedveiaehldgeihleiaeaehldgeiaeaeeheia

output:

103718

result:

ok answer is '103718'

Test #7:

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

input:

100
xoakgbazaclazfrmucgodlhrvazkyrqcwufonvcmqpvulhuudtmcfhsklletywchvvrxrjfgsfaoozzouzwfrtdlryfiqdtzjkcp

output:

104574

result:

ok answer is '104574'

Test #8:

score: 0
Accepted
time: 71ms
memory: 11816kb

input:

100
aabbaabbabaaabaaaaaabababbbabaabaaabaaabaaaabbbbababbbbbbabbbaabbbaaaaababababaabababaababaabbbabaaa

output:

103589

result:

ok answer is '103589'

Test #9:

score: 0
Accepted
time: 88ms
memory: 12568kb

input:

2000
mbrpuyrsqimuuwnmxsukdkfmhwytmfwwccfdkzljulnvlueciggqniuyocqxoiepzuzhnfwwccvmxyticsttujuzhnfwwccfwkbuuecinfwwccfwkbuueciggqniuyodfkhnfwwccfdkzljulnvlueciggqniuyocqccfwkbuueciggquyciggqniuyodfkevrpjzuzwyocqccfwkbuueciggquyciggqniuyodfkevrpjzuzhnfwwcoiynpzlqsjimovvcrzbggnciggqniuyodfkevrpjzuzhnfwy...

output:

801214345

result:

ok answer is '801214345'

Test #10:

score: 0
Accepted
time: 84ms
memory: 12352kb

input:

2000
kqxjsrvosiglekiyqcvcuziktmldotulfsjttakesboiiuwwukcuytllrixkibipmcfkibipmcfchmczrunxluomocoaltfiknghuglwiychueqazfcalzqgwoqeyifsawnaennubfacviqcwhstxgvjfggcluomocuomocoareueqazfcalzqgwoaxfchmczrunxecifuecidmpavuecidmpavxzysvebqavozoqsnnhimpjgcqnwfzhysnnaevxreouaxyykcuynghuglygfjcvyggcluomocuomo...

output:

806947518

result:

ok answer is '806947518'

Test #11:

score: 0
Accepted
time: 84ms
memory: 12432kb

input:

2000
uwgwftwgqszqrzzokbabeqpmnhlthazkxhncmmrkbhueafpsncvtpvxoxaatarvrmnpnkkrafkwzchacxcuphbwkmbtrxtydpsjzsvkskprttbyonkhwdsckvgtqvtjixayxggktqbwkhrcujsxfwiahxexnbjnzulzmpmubiqzbphrbpmvjjikcqftgnvzxzpzimpmidcmeescxhtqbukkwppipuumhpbyywdooxblckfuartpvrehkjspsscztazgtmpvqjpmjmezhroympynptcjcpvtzesfmair...

output:

812517617

result:

ok answer is '812517617'

Test #12:

score: 0
Accepted
time: 84ms
memory: 12444kb

input:

2000
aaababaaabaaaabbbaaabbaabaabbababaababbababbbbbbabaaaabbbbbbbabbbaabbababbaaabaababbababbbaaabbbabbaabbbaaabbabbabbbbabbbababaaaabbabbababaaabbbbbbababbbbabbbaababbabaabbbbababaaaababaaabbbabbaabaaabababaaababbbaabaaabbbbbabbaaaabbaabababbaaabbbbbaababbabaaaaaabababbaaabbbbabbbaaaababbabbbaaaba...

output:

812460124

result:

ok answer is '812460124'

Test #13:

score: 0
Accepted
time: 1151ms
memory: 19216kb

input:

100000
mglkvngcyzmvyrpxumiusfvkzutlgexoiyjezqsdudzbjxyovuhocbjeyhgjlncvsihuopxevcrvlmphgtmibfvqaffrgrpshxprppojmhvhfxffnscxprhrckqjefohfjadbasuksrljfonckgvvynyyhwtktgonksetyjxftgxhfyplekgmgtinfhslcmgxiiorcgndimffpvolzfrqnpdaijdkujoaqgwoowxkivrtboylhdvenwiqxbfovydkidseplcyqhheinoqrghnqilwrgkcxpkdzjrx...

output:

101324985069108

result:

ok answer is '101324985069108'

Test #14:

score: 0
Accepted
time: 1152ms
memory: 19148kb

input:

100000
knrammmidsuxwygkfulairkwldjfxyovcnfgxtajosuafyjflkjmzjfniohxucagrmthceicngqrasgcskanqrfkuqxeggafhlpxkicokvuatkxlduldrxkmhdiwxrjukqcpfbiuskbfejjxfafxpibpjzfycuaaoaerajqspchthdgnmhqwdqvkqfubyoibcflddbwbpvbtmomopuovdcbgdnifkkewxixmtcagsfifbnlrajtuccsxrjuqrphuoldurcnjwqwraoulyxsqsjkaxacouwujpyqfe...

output:

101324985069554

result:

ok answer is '101324985069554'

Test #15:

score: 0
Accepted
time: 458ms
memory: 15972kb

input:

40000
mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm...

output:

6463823387870

result:

ok answer is '6463823387870'

Test #16:

score: 0
Accepted
time: 461ms
memory: 15972kb

input:

40000
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww...

output:

6382800423488

result:

ok answer is '6382800423488'

Test #17:

score: 0
Accepted
time: 457ms
memory: 15952kb

input:

40000
bbbabbbbbbaabbaabaaaababaabaaabbbaaabaabbaaababbabbbbaabbaaababbbaababbaaabbabaaabbabbbbbbbbabaaaaaaabbabaababaabababaaaabaabaabbbbbbbaaaabaababbbbbaabbaabbaababbbbaaabaabbabbabbbaabaabbbbaabbabbbabababbbaaabbbaaababaaaaabbaaabaabaaabbabaaabbaabbaaabababaaabaabaaabaabbaabaabaabaabaababbaabbaaa...

output:

6485120267266

result:

ok answer is '6485120267266'

Test #18:

score: 0
Accepted
time: 491ms
memory: 16216kb

input:

40000
tttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttt...

output:

800020000

result:

ok answer is '800020000'

Test #19:

score: 0
Accepted
time: 1175ms
memory: 19060kb

input:

100000
ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo...

output:

101137073335748

result:

ok answer is '101137073335748'

Test #20:

score: 0
Accepted
time: 1183ms
memory: 19284kb

input:

100000
nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn...

output:

100461213430599

result:

ok answer is '100461213430599'

Test #21:

score: 0
Accepted
time: 1155ms
memory: 19108kb

input:

100000
bslghenpredjtkgndijltrmysucihsrsnselcsrumqotigyzviasrrickbbtxylubpeqjkcbzerviihnnfymdhgpongdqkpfqwrblqzxdbecktaezedfndyncabehsgoxashszbyqbfnolnbcmsdaulgdyvhfpctmhdbfycfqgfoprbnsqosocnqxiwhvtmfrvxydutmasdmbshbknusybepunclxtynonodldbrgvcatizjscrifzbjfmwrbfedntreoumkuacuszsulqebqfloydlhabbhbtjnw...

output:

101324985069047

result:

ok answer is '101324985069047'

Test #22:

score: 0
Accepted
time: 1367ms
memory: 19280kb

input:

100000
owalzrsepmooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo...

output:

66609812613

result:

ok answer is '66609812613'

Test #23:

score: 0
Accepted
time: 1161ms
memory: 19308kb

input:

100000
swtpnyrtrjjvecymbvpjkcraazjzwjnawoihpmfnjkrhbnqbpgnfldgjuuesdtwipkvxqhfcjgyurqxsbnsfquesnjpyisnvjleuflxcovfiblfkixliqflqvswyvxrfjfoopdjsdowjsrwkokguvlqrrdfxfakqdnjrmtdxvzczvovsjhvelaizfasgyjvyudsyjkrassxoheuhfbbxdorxivdzgztosybvbaffyibkvjxdnluowqyyknsicqmvqjfnvhxqriftehsugfabpbszfvqyehuekphxi...

output:

101130039817037

result:

ok answer is '101130039817037'

Test #24:

score: 0
Accepted
time: 1170ms
memory: 19284kb

input:

100000
whogzkfhreoscnrbfzczzmpapeieazzzzzagazzayapzzzzaqfoacfffitsithrtnytiegycwzczzaytsxivfiiiveeezzaqfoaqfoacdtitfffiiiqchietnypeieafzaucwqfoacdttsithrtnyiiiqfuxiveeeuuaslaazzwzzaazzwzzzzzagazzayapzzzzaqfoacfffitsithrtnytiegycwzczzaytszztsitqfoacdttsithrtndiitfffiiiqcyapecdttsithaazoatazzayaaqfoac...

output:

100955554850350

result:

ok answer is '100955554850350'

Test #25:

score: 0
Accepted
time: 1371ms
memory: 19236kb

input:

100000
qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq...

output:

5000050000

result:

ok answer is '5000050000'

Test #26:

score: 0
Accepted
time: 1193ms
memory: 19124kb

input:

99996
hfaeeqetfftvwktktfftaettttutjetjtjetjetktfftvatfjeljtakttttktfftvwklaettftvftjetjetktklftvjutjetjtjetjetvwklaettftvjutjetjjtftjetjtttttktjttljfftvwklaettfttftvjutjetjjtftjetjetktklfttvjutjetjettjeftfjeljtakttttktfftvwklaettftvftjetjetktklftvjutjetjtjetjetvwklaettftvjutjetjjtftjetjtttttktjttljf...

output:

97148038053410

result:

ok answer is '97148038053410'

Test #27:

score: 0
Accepted
time: 1216ms
memory: 19104kb

input:

99997
hazaorzbkzqhymcexwahmkkexwackcokahrzcexwahmcokazaorwahmcookxccokahrzcexwahcokahrskehmcorclclmkahrzcexwahmcokazaorwahmcookwcexwakokacoahmcookwahmcookxccokahrzcexwahmcokazaorwahxccokahrzcexwahmcokazaocokwamluorwahmcookwcexwahrzcxwahmcokwamlurclclskkxccokahrzcxhrzcexwahmcokazaorwahmzcexwaaorwahma...

output:

89901430986589

result:

ok answer is '89901430986589'

Test #28:

score: 0
Accepted
time: 1205ms
memory: 19160kb

input:

99998
ptkbpqxysqlmgpoyfjxysogysqlmgxgpogsystgmqysosgposqggtlmgxmgtgsqlmgysqggqxqlbsttsgposqlssysgytposgsqlmmqxmgpogsystgysmqxmmsgtggtpoyggtggtpospogjxysmqxysqlmgxmgtggpogsystgmqysosgposqlssgtmgxmgxmgtggtpospogjxysmqxysqlmgxmgtggtpostggtpogysqlmgysqggqxggtlmfjtgggslbsgtmgxmgxmgtggtpospogjxysmogtggtlm...

output:

93788469111158

result:

ok answer is '93788469111158'

Test #29:

score: 0
Accepted
time: 1201ms
memory: 19108kb

input:

99998
iddudaoqdudakrdanwwakrwdnoqduddanpakrwuuqakrdnpugaanpakrwuuqakrddanwwakrwdnoqduddanpaugaanpakrwuuqakrddanwwakrwdnoqduddakrddanwwakrwdnoqduddanpakrqduddanpaugaanpakrwuuqakrddanwwakrwdnduddanpakrwuuqakrdnpnpugakrwdnoqduddanpakrwuuqakrdnpnpunanwwakrwdnoqduddauoquoqnnwwwuuopurwuupuddakrddanwwakrwd...

output:

97357749831441

result:

ok answer is '97357749831441'

Extra Test:

score: 0
Extra Test Passed