QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#559291 | #9244. Counting Strings | ucup-team3931 | AC ✓ | 799ms | 67356kb | C++14 | 4.5kb | 2024-09-11 21:13:05 | 2024-09-11 21:13:12 |
Judging History
answer
#include <bits/stdc++.h>
#define pb emplace_back
#define fst first
#define scd second
#define mkp make_pair
#define mems(a, x) memset((a), (x), sizeof(a))
using namespace std;
typedef long long ll;
typedef double db;
typedef unsigned long long ull;
typedef long double ldb;
typedef pair<ll, ll> pii;
const int maxn = 200100;
const int logn = 20;
int n, pr[maxn], tot, m, p[maxn], mpr[maxn], st[logn][maxn], dfn[maxn], tim;
int q[maxn], pre[maxn], nxt[maxn], d[maxn];
char s[maxn];
bool vis[maxn];
vector<int> G[maxn], ps[maxn];
struct SAM {
int lst, tot, fa[maxn], ch[maxn][26], len[maxn];
inline void init() {
lst = tot = 1;
}
inline void insert(int k, int c) {
int u = ++tot, p = lst;
lst = u;
len[u] = k;
for (; p && !ch[p][c]; p = fa[p]) {
ch[p][c] = u;
}
if (!p) {
fa[u] = 1;
return;
}
int q = ch[p][c];
if (len[q] == len[p] + 1) {
fa[u] = q;
return;
}
int nq = ++tot;
fa[nq] = fa[q];
len[nq] = len[p] + 1;
memcpy(ch[nq], ch[q], sizeof(ch[nq]));
fa[u] = fa[q] = nq;
for (; p && ch[p][c] == q; p = fa[p]) {
ch[p][c] = nq;
}
}
} sam;
void dfs(int u, int fa) {
dfn[u] = ++tim;
st[0][tim] = fa;
for (int v : G[u]) {
dfs(v, u);
}
}
inline int get(int i, int j) {
return dfn[i] < dfn[j] ? i : j;
}
inline int qlca(int x, int y) {
if (x == y) {
return x;
}
x = dfn[x];
y = dfn[y];
if (x > y) {
swap(x, y);
}
++x;
int k = __lg(y - x + 1);
return get(st[k][x], st[k][y - (1 << k) + 1]);
}
struct DS {
int bel[maxn], blo, L[maxn], R[maxn], a[maxn], b[maxn];
inline void init() {
blo = sqrt(n);
for (int i = 1; i <= n; ++i) {
bel[i] = (i - 1) / blo + 1;
if (!L[bel[i]]) {
L[bel[i]] = i;
}
R[bel[i]] = i;
}
}
inline void update(int x, int y) {
a[x] += y;
b[bel[x]] += y;
}
inline void update(int l, int r, int x) {
l = max(l, 1);
if (l > r) {
return;
}
update(l, x);
update(r + 1, -x);
}
inline int query(int x) {
int res = 0;
for (int i = 1; i < bel[x]; ++i) {
res += b[i];
}
for (int i = L[bel[x]]; i <= x; ++i) {
res += a[i];
}
return res;
}
} ds;
ll ans = 1;
void work(int x, int t) {
// printf("x: %d\n", x);
for (int i : ps[x]) {
// printf("i: %d %d\n", i, ds.query(i));
ans += 1LL * (i + 1) * ds.query(i);
}
for (int j = t; j <= tot && 1LL * x * pr[j] < n; ++j) {
vector<int> S;
for (int k = pr[j]; k <= n; k += pr[j]) {
if (vis[k]) {
continue;
}
// printf("del %d\n", k);
int l = pre[k], r = nxt[k];
nxt[l] = r;
pre[r] = l;
int xx = qlca(p[l], p[k]), yy = qlca(p[k], p[r]);
if (dfn[xx] < dfn[yy]) {
swap(xx, yy);
}
// printf("upd: %d %d\n", sam.len[xx], sam.len[p[k]]);
ds.update(sam.len[xx], sam.len[p[k]] - 1, -1);
vis[k] = 1;
d[k] = xx;
S.pb(k);
}
work(x * pr[j], j + 1);
for (int k : S) {
int l = pre[k], r = nxt[k];
nxt[l] = pre[r] = k;
int xx = d[k];
ds.update(sam.len[xx], sam.len[p[k]] - 1, 1);
vis[k] = 0;
}
}
}
void solve() {
scanf("%d%s", &n, s + 1);
if (n == 1) {
puts("1");
return;
}
sam.init();
p[0] = 1;
for (int i = 1; i <= n; ++i) {
sam.insert(i, s[i] - 'a');
p[i] = sam.lst;
q[i] = i;
// printf("p[%d] = %d\n", i, p[i]);
}
m = sam.tot;
for (int i = 2; i <= m; ++i) {
G[sam.fa[i]].pb(i);
}
for (int i = 2; i <= n; ++i) {
if (!vis[i]) {
pr[++tot] = i;
mpr[i] = i;
}
for (int j = 1; j <= tot && i * pr[j] <= n; ++j) {
vis[i * pr[j]] = 1;
mpr[i * pr[j]] = pr[j];
if (i % pr[j] == 0) {
break;
}
}
}
for (int i = 1; i <= n; ++i) {
int x = i, y = 1;
while (x > 1) {
int t = mpr[x];
y *= t;
while (x % t == 0) {
x /= t;
}
}
ps[y].pb(i);
}
dfs(1, 0);
for (int j = 1; (1 << j) <= m; ++j) {
for (int i = 1; i + (1 << j) - 1 <= m; ++i) {
st[j][i] = get(st[j - 1][i], st[j - 1][i + (1 << (j - 1))]);
}
}
sort(q + 1, q + n + 1, [&](const int &x, const int &y) {
return dfn[p[x]] < dfn[p[y]];
});
for (int i = 1; i <= n; ++i) {
pre[q[i]] = q[i - 1];
nxt[q[i]] = q[i + 1];
}
ds.init();
for (int i = 2; i <= m; ++i) {
// printf("i: %d %d %d\n", i, sam.len[sam.fa[i]] + 1, sam.len[i]);
// printf("%d %d\n", sam.fa[i], i);
ds.update(sam.len[sam.fa[i]], sam.len[i] - 1, 1);
}
mems(vis, 0);
work(1, 1);
printf("%lld\n", ans);
}
int main() {
int T = 1;
// scanf("%d", &T);
while (T--) {
solve();
}
return 0;
}
这程序好像有点Bug,我给组数据试试?
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 2ms
memory: 30312kb
input:
4 abca
output:
14
result:
ok answer is '14'
Test #2:
score: 0
Accepted
time: 3ms
memory: 16160kb
input:
1 a
output:
1
result:
ok answer is '1'
Test #3:
score: 0
Accepted
time: 0ms
memory: 26596kb
input:
2 aa
output:
3
result:
ok answer is '3'
Test #4:
score: 0
Accepted
time: 0ms
memory: 28632kb
input:
2 ab
output:
3
result:
ok answer is '3'
Test #5:
score: 0
Accepted
time: 0ms
memory: 32556kb
input:
100 xgljgljgljjljjjjljtjljtgljgljgljjljjjjljtjljtjljgljljgljgljjljjjjljtjljtjljgljllljgllgljgljjglljgljl
output:
101808
result:
ok answer is '101808'
Test #6:
score: 0
Accepted
time: 6ms
memory: 30504kb
input:
100 ilhliaiehaiehldgeieieedveldgeaeaehldgeldgeiiedeiaiehaiehldgeieieedveiaehldgeihleiaeaehldgeiaeaeeheia
output:
103718
result:
ok answer is '103718'
Test #7:
score: 0
Accepted
time: 0ms
memory: 30696kb
input:
100 xoakgbazaclazfrmucgodlhrvazkyrqcwufonvcmqpvulhuudtmcfhsklletywchvvrxrjfgsfaoozzouzwfrtdlryfiqdtzjkcp
output:
104574
result:
ok answer is '104574'
Test #8:
score: 0
Accepted
time: 0ms
memory: 30444kb
input:
100 aabbaabbabaaabaaaaaabababbbabaabaaabaaabaaaabbbbababbbbbbabbbaabbbaaaaababababaabababaababaabbbabaaa
output:
103589
result:
ok answer is '103589'
Test #9:
score: 0
Accepted
time: 3ms
memory: 38832kb
input:
2000 mbrpuyrsqimuuwnmxsukdkfmhwytmfwwccfdkzljulnvlueciggqniuyocqxoiepzuzhnfwwccvmxyticsttujuzhnfwwccfwkbuuecinfwwccfwkbuueciggqniuyodfkhnfwwccfdkzljulnvlueciggqniuyocqccfwkbuueciggquyciggqniuyodfkevrpjzuzwyocqccfwkbuueciggquyciggqniuyodfkevrpjzuzhnfwwcoiynpzlqsjimovvcrzbggnciggqniuyodfkevrpjzuzhnfwy...
output:
801214345
result:
ok answer is '801214345'
Test #10:
score: 0
Accepted
time: 0ms
memory: 32512kb
input:
2000 kqxjsrvosiglekiyqcvcuziktmldotulfsjttakesboiiuwwukcuytllrixkibipmcfkibipmcfchmczrunxluomocoaltfiknghuglwiychueqazfcalzqgwoqeyifsawnaennubfacviqcwhstxgvjfggcluomocuomocoareueqazfcalzqgwoaxfchmczrunxecifuecidmpavuecidmpavxzysvebqavozoqsnnhimpjgcqnwfzhysnnaevxreouaxyykcuynghuglygfjcvyggcluomocuomo...
output:
806947518
result:
ok answer is '806947518'
Test #11:
score: 0
Accepted
time: 0ms
memory: 36808kb
input:
2000 uwgwftwgqszqrzzokbabeqpmnhlthazkxhncmmrkbhueafpsncvtpvxoxaatarvrmnpnkkrafkwzchacxcuphbwkmbtrxtydpsjzsvkskprttbyonkhwdsckvgtqvtjixayxggktqbwkhrcujsxfwiahxexnbjnzulzmpmubiqzbphrbpmvjjikcqftgnvzxzpzimpmidcmeescxhtqbukkwppipuumhpbyywdooxblckfuartpvrehkjspsscztazgtmpvqjpmjmezhroympynptcjcpvtzesfmair...
output:
812517617
result:
ok answer is '812517617'
Test #12:
score: 0
Accepted
time: 3ms
memory: 35104kb
input:
2000 aaababaaabaaaabbbaaabbaabaabbababaababbababbbbbbabaaaabbbbbbbabbbaabbababbaaabaababbababbbaaabbbabbaabbbaaabbabbabbbbabbbababaaaabbabbababaaabbbbbbababbbbabbbaababbabaabbbbababaaaababaaabbbabbaabaaabababaaababbbaabaaabbbbbabbaaaabbaabababbaaabbbbbaababbabaaaaaabababbaaabbbbabbbaaaababbabbbaaaba...
output:
812460124
result:
ok answer is '812460124'
Test #13:
score: 0
Accepted
time: 732ms
memory: 56700kb
input:
100000 mglkvngcyzmvyrpxumiusfvkzutlgexoiyjezqsdudzbjxyovuhocbjeyhgjlncvsihuopxevcrvlmphgtmibfvqaffrgrpshxprppojmhvhfxffnscxprhrckqjefohfjadbasuksrljfonckgvvynyyhwtktgonksetyjxftgxhfyplekgmgtinfhslcmgxiiorcgndimffpvolzfrqnpdaijdkujoaqgwoowxkivrtboylhdvenwiqxbfovydkidseplcyqhheinoqrghnqilwrgkcxpkdzjrx...
output:
101324985069108
result:
ok answer is '101324985069108'
Test #14:
score: 0
Accepted
time: 715ms
memory: 59116kb
input:
100000 knrammmidsuxwygkfulairkwldjfxyovcnfgxtajosuafyjflkjmzjfniohxucagrmthceicngqrasgcskanqrfkuqxeggafhlpxkicokvuatkxlduldrxkmhdiwxrjukqcpfbiuskbfejjxfafxpibpjzfycuaaoaerajqspchthdgnmhqwdqvkqfubyoibcflddbwbpvbtmomopuovdcbgdnifkkewxixmtcagsfifbnlrajtuccsxrjuqrphuoldurcnjwqwraoulyxsqsjkaxacouwujpyqfe...
output:
101324985069554
result:
ok answer is '101324985069554'
Test #15:
score: 0
Accepted
time: 130ms
memory: 50592kb
input:
40000 mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm...
output:
6463823387870
result:
ok answer is '6463823387870'
Test #16:
score: 0
Accepted
time: 110ms
memory: 47068kb
input:
40000 wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww...
output:
6382800423488
result:
ok answer is '6382800423488'
Test #17:
score: 0
Accepted
time: 149ms
memory: 47956kb
input:
40000 bbbabbbbbbaabbaabaaaababaabaaabbbaaabaabbaaababbabbbbaabbaaababbbaababbaaabbabaaabbabbbbbbbbabaaaaaaabbabaababaabababaaaabaabaabbbbbbbaaaabaababbbbbaabbaabbaababbbbaaabaabbabbabbbaabaabbbbaabbabbbabababbbaaabbbaaababaaaaabbaaabaabaaabbabaaabbaabbaaabababaaabaabaaabaabbaabaabaabaabaababbaabbaaa...
output:
6485120267266
result:
ok answer is '6485120267266'
Test #18:
score: 0
Accepted
time: 59ms
memory: 43964kb
input:
40000 tttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttt...
output:
800020000
result:
ok answer is '800020000'
Test #19:
score: 0
Accepted
time: 746ms
memory: 64660kb
input:
100000 ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo...
output:
101137073335748
result:
ok answer is '101137073335748'
Test #20:
score: 0
Accepted
time: 705ms
memory: 62040kb
input:
100000 nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn...
output:
100461213430599
result:
ok answer is '100461213430599'
Test #21:
score: 0
Accepted
time: 703ms
memory: 59140kb
input:
100000 bslghenpredjtkgndijltrmysucihsrsnselcsrumqotigyzviasrrickbbtxylubpeqjkcbzerviihnnfymdhgpongdqkpfqwrblqzxdbecktaezedfndyncabehsgoxashszbyqbfnolnbcmsdaulgdyvhfpctmhdbfycfqgfoprbnsqosocnqxiwhvtmfrvxydutmasdmbshbknusybepunclxtynonodldbrgvcatizjscrifzbjfmwrbfedntreoumkuacuszsulqebqfloydlhabbhbtjnw...
output:
101324985069047
result:
ok answer is '101324985069047'
Test #22:
score: 0
Accepted
time: 596ms
memory: 67356kb
input:
100000 owalzrsepmooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo...
output:
66609812613
result:
ok answer is '66609812613'
Test #23:
score: 0
Accepted
time: 733ms
memory: 58884kb
input:
100000 swtpnyrtrjjvecymbvpjkcraazjzwjnawoihpmfnjkrhbnqbpgnfldgjuuesdtwipkvxqhfcjgyurqxsbnsfquesnjpyisnvjleuflxcovfiblfkixliqflqvswyvxrfjfoopdjsdowjsrwkokguvlqrrdfxfakqdnjrmtdxvzczvovsjhvelaizfasgyjvyudsyjkrassxoheuhfbbxdorxivdzgztosybvbaffyibkvjxdnluowqyyknsicqmvqjfnvhxqriftehsugfabpbszfvqyehuekphxi...
output:
101130039817037
result:
ok answer is '101130039817037'
Test #24:
score: 0
Accepted
time: 799ms
memory: 62912kb
input:
100000 whogzkfhreoscnrbfzczzmpapeieazzzzzagazzayapzzzzaqfoacfffitsithrtnytiegycwzczzaytsxivfiiiveeezzaqfoaqfoacdtitfffiiiqchietnypeieafzaucwqfoacdttsithrtnyiiiqfuxiveeeuuaslaazzwzzaazzwzzzzzagazzayapzzzzaqfoacfffitsithrtnytiegycwzczzaytszztsitqfoacdttsithrtndiitfffiiiqcyapecdttsithaazoatazzayaaqfoac...
output:
100955554850350
result:
ok answer is '100955554850350'
Test #25:
score: 0
Accepted
time: 413ms
memory: 55100kb
input:
100000 qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq...
output:
5000050000
result:
ok answer is '5000050000'
Test #26:
score: 0
Accepted
time: 701ms
memory: 61032kb
input:
99996 hfaeeqetfftvwktktfftaettttutjetjtjetjetktfftvatfjeljtakttttktfftvwklaettftvftjetjetktklftvjutjetjtjetjetvwklaettftvjutjetjjtftjetjtttttktjttljfftvwklaettfttftvjutjetjjtftjetjetktklfttvjutjetjettjeftfjeljtakttttktfftvwklaettftvftjetjetktklftvjutjetjtjetjetvwklaettftvjutjetjjtftjetjtttttktjttljf...
output:
97148038053410
result:
ok answer is '97148038053410'
Test #27:
score: 0
Accepted
time: 725ms
memory: 63764kb
input:
99997 hazaorzbkzqhymcexwahmkkexwackcokahrzcexwahmcokazaorwahmcookxccokahrzcexwahcokahrskehmcorclclmkahrzcexwahmcokazaorwahmcookwcexwakokacoahmcookwahmcookxccokahrzcexwahmcokazaorwahxccokahrzcexwahmcokazaocokwamluorwahmcookwcexwahrzcxwahmcokwamlurclclskkxccokahrzcxhrzcexwahmcokazaorwahmzcexwaaorwahma...
output:
89901430986589
result:
ok answer is '89901430986589'
Test #28:
score: 0
Accepted
time: 685ms
memory: 62220kb
input:
99998 ptkbpqxysqlmgpoyfjxysogysqlmgxgpogsystgmqysosgposqggtlmgxmgtgsqlmgysqggqxqlbsttsgposqlssysgytposgsqlmmqxmgpogsystgysmqxmmsgtggtpoyggtggtpospogjxysmqxysqlmgxmgtggpogsystgmqysosgposqlssgtmgxmgxmgtggtpospogjxysmqxysqlmgxmgtggtpostggtpogysqlmgysqggqxggtlmfjtgggslbsgtmgxmgxmgtggtpospogjxysmogtggtlm...
output:
93788469111158
result:
ok answer is '93788469111158'
Test #29:
score: 0
Accepted
time: 766ms
memory: 65128kb
input:
99998 iddudaoqdudakrdanwwakrwdnoqduddanpakrwuuqakrdnpugaanpakrwuuqakrddanwwakrwdnoqduddanpaugaanpakrwuuqakrddanwwakrwdnoqduddakrddanwwakrwdnoqduddanpakrqduddanpaugaanpakrwuuqakrddanwwakrwdnduddanpakrwuuqakrdnpnpugakrwdnoqduddanpakrwuuqakrdnpnpunanwwakrwdnoqduddauoquoqnnwwwuuopurwuupuddakrddanwwakrwd...
output:
97357749831441
result:
ok answer is '97357749831441'
Extra Test:
score: 0
Extra Test Passed