QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#586095 | #9244. Counting Strings | ucup-team4435 | AC ✓ | 1371ms | 19308kb | C++20 | 5.6kb | 2024-09-24 02:29:27 | 2024-09-24 02:29:27 |
Judging History
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,我给组数据试试?
詳細信息
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