QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#4521 | #425. 字符串 | Qingyu | 100 ✓ | 1553ms | 95728kb | C++11 | 6.9kb | 2020-06-27 17:31:12 | 2021-12-19 05:21:43 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
typedef pair<int, int> P;
const int N = 2e5 + 5;
int lo[N];
int n, q, l, r, i, j, ans[N];
char c[N];
struct SA {
char c[N];
int sa[N], rk[N], h[N], f[20][N];
inline void build() {
static int buc[N], a[N], b[N], rk1[N], rk2[N];
int p, d, i, j;
for (i = 1; i <= n; ++i) rk[i] = c[i] == 'a' ? 1 : 2;
p = 2;
for (d = 0; 1 << d <= n; ++d) {
for (i = 1; i <= n; ++i) rk1[i] = rk[i], rk2[i] = i + (1 << d) <= n ? rk[i + (1 << d)] : 0;
memset(buc, 0, p + 1 << 2);
for (i = 1; i <= n; ++i) ++buc[rk2[i]];
for (i = 1; i <= p; ++i) buc[i] += buc[i - 1];
for (i = 1; i <= n; ++i) a[buc[rk2[i]]--] = i;
memset(buc, 0, p + 1 << 2);
for (i = 1; i <= n; ++i) ++buc[rk1[i]];
for (i = 1; i <= p; ++i) buc[i] += buc[i - 1];
for (i = n; i; --i) b[buc[rk1[a[i]]]--] = a[i];
p = 0;
for (i = 1; i <= n; ++i) rk[b[i]] = p += rk1[b[i]] > rk1[b[i - 1]] || rk2[b[i]] > rk2[b[i - 1]];
}
for (i = 1; i <= n; ++i) sa[rk[i]] = i;
for (i = 1, j = 0; i <= n; ++i) {
if (rk[i] == n) {
j = 0;
continue;
}
for (j ? --j : 0; i + j <= n && c[i + j] == c[sa[rk[i] + 1] + j]; ++j)
;
h[rk[i]] = j;
}
memcpy(f[0] + 1, h + 1, n << 2);
for (i = 1; 1 << i <= n; ++i)
for (j = 1; j + (1 << i) - 1 <= n; ++j) f[i][j] = min(f[i - 1][j], f[i - 1][j + (1 << i - 1)]);
}
inline int lcp(int x, int y) { // x!=y
if (x == y)
return n - x + 1;
x = rk[x];
y = rk[y];
if (x > y)
swap(x, y);
int l = lo[y - x];
return min(f[l][x], f[l][y - (1 << l)]);
}
} A, B;
struct atom {
int u, d, la, l;
};
inline bool cmp(const atom& a, const atom& b) { return a.l < b.l; }
vector<atom> ve1[N], ve2[N];
set<int> se[N];
struct str {
int l, r;
inline bool operator<(const str& rhs) const {
int a = A.lcp(l, rhs.l), l1 = r - l + 1, l2 = rhs.r - rhs.l + 1;
return a < min(l1, l2) ? c[l + a] < c[rhs.l + a] : l1 < l2;
}
};
map<str, int> mp;
int scnt;
namespace Q1 {
inline void tryins(int l, int r) {
if (c[l] != c[r])
return;
int x = B.lcp(n - l + 1, n - r + 1), y = A.lcp(l, r), d = r - l, i;
l -= x - 1;
r += y - 1;
if (r - l + 1 < d * 2 || se[l].count(r))
return;
se[l].insert(r);
int lm = min(d, r - l + 1 - d * 2 + 1);
for (int i = 0; i < lm; ++i) {
int& u = mp[(str){ l + i, l + i + d - 1 }];
u = max(u, (r - (l + i) + 1) / d);
}
}
inline void work(int o) {
static int st[N];
int w = 0;
for (i = n; i; --i) {
for (; w && (A.rk[i] < A.rk[st[w]]) == o; --w)
;
if (w)
tryins(i, st[w]);
st[++w] = i;
}
}
inline void main() {
cin >> l >> r;
memmove(c + 1, c + l, r - l + 1);
n = r - l + 1;
c[n + 1] = 0;
memcpy(A.c + 1, c + 1, n);
A.build();
reverse(c + 1, c + n + 1);
memcpy(B.c + 1, c + 1, n);
B.build();
reverse(c + 1, c + n + 1);
work(0);
work(1);
int ans = 0;
for (map<str, int>::iterator it = mp.begin(); it != mp.end(); ++it) ans += it->second >> 1;
cout << ans << endl;
}
} // namespace Q1
inline void tryins(int l, int r) {
if (c[l] != c[r])
return;
int x = B.lcp(n - l + 1, n - r + 1), y = A.lcp(l, r), d = r - l, i;
l -= x - 1;
r += y - 1;
if (r - l + 1 < d * 2 || se[l].count(r))
return;
se[l].insert(r);
static int a[N];
int lm = min(d, r - l + 1 - d * 2 + 1);
for (i = 0; i < lm; ++i) {
str u = (str){ l + i, l + i + d - 1 };
if (!mp.count(u))
mp[u] = ++scnt;
a[i] = mp[u];
}
for (i = d * 2; i <= r - l + 1; ++i) ve1[l + i - 1].push_back((atom){ a[i % d], d, i / d, i / d * d });
for (i = 0; i < lm; ++i) {
str u = (str){ r - i - d + 1, r - i };
if (!mp.count(u))
mp[u] = ++scnt;
a[i] = mp[u];
}
for (i = d * 2; i <= r - l + 1; ++i) ve2[r - i + 1].push_back((atom){ a[i % d], d, i / d, i / d * d });
}
inline void work(int o) {
static int st[N];
int w = 0;
for (i = n; i; --i) {
for (; w && (A.rk[i] < A.rk[st[w]]) == o; --w)
;
if (w)
tryins(i, st[w]);
st[++w] = i;
}
}
namespace DS {
const int U = 3e6;
int a[U], bel[N], B, j, k, l, st1[N], st2[N], ow, w, oass, ass, ql[N];
vector<P> qu[N];
inline void ins(int l, int r, int rr) {
ow = w;
oass = ass;
for (int j = r; j >= l; --j)
for (int k = 0; k < ve2[j].size() && j + ve2[j][k].d * 2 - 1 <= rr; ++k) {
st1[++w] = ve2[j][k].u;
st2[w] = a[st1[w]];
ass -= a[st1[w]] >> 1;
a[st1[w]] = max(a[st1[w]], min((rr - j + 1) / ve2[j][k].d, ve2[j][k].la));
ass += a[st1[w]] >> 1;
}
}
inline void goback() {
for (; w > ow;) a[st1[w]] = st2[w], --w;
ass = oass;
}
inline void main() {
B = sqrt(n * 0.7);
B = min(max(B, 1), n);
for (i = 1; i <= n; ++i) bel[i] = (i - 1) / B + 1;
for (i = 1; i <= q; ++i) {
scanf("%d%d", &l, &r);
ql[i] = l;
if (bel[l] == bel[r]) {
ins(l, r, r);
ans[i] = ass;
goback();
} else
qu[bel[l]].push_back(P(r, i));
}
for (i = 1; i < bel[n]; ++i) {
sort(qu[i].begin(), qu[i].end());
ass = 0;
memset(a + 1, 0, scnt << 2);
int L = i * B;
for (j = 0, k = L; j < qu[i].size(); ++j) {
for (; k < qu[i][j].first;) {
++k;
for (l = 0; l < ve1[k].size() && k - ve1[k][l].d * 2 + 1 > L; ++l) {
ass -= a[ve1[k][l].u] >> 1;
a[ve1[k][l].u] = max(a[ve1[k][l].u], min((k - L + 1) / ve1[k][l].d, ve1[k][l].la));
ass += a[ve1[k][l].u] >> 1;
}
}
ins(ql[qu[i][j].second], L, qu[i][j].first);
ans[qu[i][j].second] = ass;
goback();
}
}
for (i = 1; i <= q; ++i) printf("%d\n", ans[i]);
}
} // namespace DS
int main() {
for (i = 2; i < N; ++i) lo[i] = lo[i >> 1] + 1;
scanf("%d%d%s", &n, &q, c + 1);
if (q == 1) {
Q1::main();
return 0;
}
memcpy(A.c + 1, c + 1, n);
A.build();
reverse(c + 1, c + n + 1);
memcpy(B.c + 1, c + 1, n);
B.build();
reverse(c + 1, c + n + 1);
work(0);
work(1);
for (i = 1; i <= n; ++i) {
sort(ve1[i].begin(), ve1[i].end(), cmp);
sort(ve2[i].begin(), ve2[i].end(), cmp);
}
DS::main();
}
詳細信息
Test #1:
score: 10
Accepted
time: 59ms
memory: 35344kb
input:
100 200000 bbababbaaabaaabbbabbabbabbabbaabbbabbabbabbabbaabbbabbabbabbabbaabbbabbabbabbabbaabbbabbabbabbabbbab 1 100 31 92 11 60 30 41 41 57 15 88 12 91 65 86 13 38 35 38 7 86 2 96 8 57 41 43 24 38 2 6 79 84 3 71 15 53 69 69 32 44 67 99 52 66 21 80 17 25 72 72 25 72 60 64 6 15 21 70 14 15 50 71 14 71 47 58 64 93 46 84 55 89 4 96 73 91 14 39 31 92 53 64 7 22 10 26 22 98 61 83 3 22 37 67 16 74 15 90 37 70 21 68 78 88 17 19 82 91 73 91 43 96 53 55 14 89 27 44 45 69 51 52 93 100 66 96 31 90 19 61 3...
output:
47 25 23 5 5 32 37 8 8 1 34 46 21 1 4 2 2 28 14 0 5 8 7 25 4 0 23 1 4 25 0 8 25 5 8 14 10 44 5 8 25 5 6 5 34 8 7 8 25 34 9 23 2 0 4 5 25 1 34 6 8 0 2 8 25 18 25 2 3 8 25 1 2 6 21 3 1 27 10 3 22 23 12 27 8 7 25 15 25 8 37 3 8 27 4 8 5 25 3 25 25 5 25 17 9 8 7 44 30 1 19 25 3 3 37 28 5 25 8 1 15 5 8 13 9 16 31 14 8 8 17 25 3 41 0 34 2 8 1 15 25 5 8 6 0 7 1 18 22 2 29 5 32 8 1 8 8 25 8 9 8 0 22 21 20 4 5 4 7 8 4 9 5 6 20 25 8 10 8 40 25 25 8 12 13 25 12 9 6 16 25 4 25 20 8 1 27 2 1 4 3 5 5 25 10 4 ...
result:
ok 200000 numbers
Test #2:
score: 10
Accepted
time: 73ms
memory: 35780kb
input:
500 200000 abaabaaaabaabaaaabaabaaaabaabaaaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabbaaaabaabaaaabaabaaaabaabaaaabaabaaaabaabaaaabaabaaaabababababaaaabababababaaaabababababaaaabababababaaaabababababaaaababababa...
output:
267 228 46 31 74 26 38 92 30 15 135 108 10 195 86 129 128 181 41 1 61 31 196 43 217 60 66 52 134 189 113 14 129 101 140 44 65 89 0 148 93 23 99 177 253 27 60 106 227 123 63 36 96 49 57 17 210 148 167 37 203 177 165 208 193 241 76 3 28 35 163 228 9 6 208 73 21 184 97 33 98 10 190 109 4 42 229 31 87 186 108 70 30 135 136 134 85 112 41 2 154 163 66 89 36 45 109 73 94 45 101 5 2 3 37 55 31 47 33 0 161 219 84 125 188 110 82 109 14 105 204 60 19 17 179 130 68 126 19 160 169 2 58 190 120 4 40 0 221 250...
result:
ok 200000 numbers
Test #3:
score: 10
Accepted
time: 130ms
memory: 37808kb
input:
5000 200000 babbbabaaabbaaabababbabaaabbaaabababbabaaabbaaabababbabaaabbaaabababbabaaabbaaabababbabaaabbaaababaababbabaaabbaaababaababbabaaabbaaababaababbabaaabbaaababaababbabaaabbaaababaabbabaaabbaaabababbabaaabbaaabababbabaaabbaaabababbabaaabbaaabababbabaaabbaaababaababbabaaabbaaababaababbabaaabbaaababaababbabaaabbaaababaababbabaaabbaaababaababbabaaabbaaababaababbabaaabbaaababaabbabaaabbaaabababbabaaabbaaababaaaabbababababababababababababaaaabaabaaaabaabaaaabaabaaaabaabaaaabaabaaaabaabaaaaaaaa...
output:
1579 690 292 449 478 532 547 582 1274 1002 458 680 344 1439 1220 602 319 268 1421 1230 1367 1325 798 490 757 361 440 719 572 727 628 221 645 228 418 1390 311 802 662 1003 712 388 954 1022 157 99 44 607 825 583 279 4 227 1285 347 983 514 418 1526 533 499 334 1049 976 1260 79 1071 139 739 940 482 117 136 22 512 917 229 27 320 688 312 816 959 941 834 156 347 694 1070 576 293 418 287 123 552 521 659 767 178 264 120 790 715 613 357 487 24 1047 270 1116 702 442 345 421 860 815 115 446 180 845 939 394 ...
result:
ok 200000 numbers
Test #4:
score: 10
Accepted
time: 120ms
memory: 37656kb
input:
5000 200000 babbbaaabaaababbbbbaaaababbababbababaaaabbbbbaaababaaababbbbbaaaababbababbababaaaabbbbbaaababaaababbbbbaaaababbababbababaaaabbbbbaaababaaababbbbbaaaababbababababbababaaaabbbbbaaababaaababbbbbaaaababbababababbababaaaabbbbbaaababaaababbbbbaaaababbababababbababaaaabbbbbaaababaaababbbbbaaaababbababababbababaaaabbbbbaaababaaababbbbbaaaababbababababbababaaaabbbbbaaababaaababbbbbaaaababbababababbababaaaabbbbbaaababaaababbbbbaaaababbababababbababaaaabbbbbaaababaaababbbbbaaaababbababababbabab...
output:
2259 9 2113 60 603 1764 1553 270 1645 1302 893 673 49 1197 684 1855 149 229 703 572 566 121 426 1989 1511 1177 1595 450 422 698 2080 106 1104 780 102 1294 121 141 377 551 351 233 337 1295 382 1343 290 494 429 312 534 270 807 965 474 796 698 1083 1477 597 547 44 189 754 290 1314 290 2022 657 2094 326 718 380 1055 700 1574 1526 421 153 9 594 755 1218 817 678 205 198 610 1054 728 11 1163 1182 541 290 2209 1144 262 290 417 272 1996 136 767 684 428 1020 987 1170 879 1184 846 127 619 525 1209 1664 121...
result:
ok 200000 numbers
Test #5:
score: 10
Accepted
time: 1519ms
memory: 92828kb
input:
200000 200000 baababbbbbbbbbbabaaababbaabbabaaaabbaabbbbabaaaabbabbbababaaaabbaabbabaaaabbaabbbbabaaaabbabbbababaaaabbaabbabaaaabbaabbbbabaaaabbabbbababaaaabbaabbabaaaabbaabbbbabaaaabbabbbababaaaabbaabbabaaaabbaabbaabbabbbababaaaabbaabbabaaaabbaabbbbabaaaabbabbbababaaaabbaabbabaaaabbaabbaabbabbbababaaaabbaabbabaaaabbaabbbbabaaaabbabbbababaaaabbaabbabaaaabbaabbaabbabbbababaaaabbaabbabaaaabbaabbbbabaaaabbabbbababaaaabbaabbabaaaabbaabbaabbabbbababaaaabbaabbabaaaabbaabbbbabaaaabbabbbababaaaabbaabbab...
output:
68438 45123 38818 46365 13546 7147 10377 8922 3951 44132 6410 1388 20906 690 50086 4631 18933 18822 22669 44608 28391 11295 31315 6168 31068 20692 6147 18695 1300 27271 13267 21249 5588 9160 3260 42369 37012 31726 10824 34540 3201 5039 17901 8422 9614 1648 19325 17163 11452 16870 43045 12248 36786 49719 21489 66085 26936 1573 3376 1286 44102 24497 34590 14596 42452 1334 46936 10160 6724 350 1728 16920 48003 28168 24622 42457 6982 28078 28265 24944 3774 3665 11036 11231 7959 46503 40457 32429 650...
result:
ok 200000 numbers
Test #6:
score: 10
Accepted
time: 1553ms
memory: 94988kb
input:
200000 200000 baababaaabbaabbbababaaaaabaababbaabaabaaaaabbabbabbbaaabbaaabbbaabbbaabaabbbbbaabbbaababbbbaababababbbbabbbaababaaaabaabbaabbbaaabababbbbaabbabbbbaabbaaabbaaaaaabbaaaaabababbbabbbbbabbbbbaaabbaaaaaabbaaaaabababbbabbbbbabbbbbaaabbaaaaaabbaaaaabababbbabbbbbabbbbbaaabbaaaaaabbaaaaabababbbabbbbbabbbbbaaabbaaaaaabbaaaaabababbbabbbbbabbbbbaaabbaaaaaabbaaaaabababbbabbbbbabbbbbaaabbaaaaaabbaaaaabababbbabbbbbabbbbbaaabbaaaaaabbaaaaabababbbabbbbbabbbbbaaabbaaaaaabbaaaaabababbbabbbbbaabbbabbb...
output:
70193 7004 8538 42161 1855 28580 24923 890 39782 19352 17348 3974 14491 24655 44433 22996 24218 41097 12977 32753 6653 34188 6674 1767 8825 65609 85 42728 25542 22940 27115 109 3784 24492 6973 53193 23009 56985 3448 11437 5675 26682 35093 22606 39244 19566 4696 30120 17531 6286 16215 24996 2099 19129 9284 3984 20803 35404 48259 16595 5896 45442 13742 42738 41686 8171 7333 22829 5618 57101 52069 1136 60945 5380 36815 22908 31309 16329 32502 864 29965 31178 25360 42376 4108 15080 6842 542 7152 293...
result:
ok 200000 numbers
Test #7:
score: 10
Accepted
time: 124ms
memory: 71828kb
input:
200000 1 abbbabbabbbabbabbbabbabbbabbabbbabbabbbabbabbbabbabbbabbabbbabbabbbabbabbbabbabbbabbabbbabbabbbabbabbbabbabbbabbabbbabbabbbabbabbbabbabbbabbabbbabbabbbabbabbbabbabbbabbabbbabbabbbabbabbbabbabbbabbabbbabbabbbabbabbbabbabbbabbabbbabbabbbabbabbbabbabbbabbabbbabbabbbabbabbbabbabbbabbabbbabbabbbabbabbbabbabbbabbabbbabbabbbabbabbbabbabbbabbabbbabbabbbabbabbbabbabbbabbabbbabbabbbabbabbbabbabbbabbabbbabbabbbabbabbbabbabbbabbabbbabbabbbabbabbbabbabbbabbabbbabbabbbabbabbbabbabbbabbabbbabbabbbabba...
output:
65357
result:
ok 1 number(s): "65357"
Test #8:
score: 10
Accepted
time: 126ms
memory: 70700kb
input:
200000 1 bbbbabaaaaaaababaaabbabbbbaaababbbabbababbabbababbabaaabbabbbbaaababbbabbababbabbababbabaaabbabbbbaaababbbabbababbabbababbabaaabbabbbbaaababbbabbababbabbababbabaaabbabbbbaaababbbabbababbabbababbabaaabbabbbbaaababbbabbababbabbababbabaaabbabbbbaaababbbabbababbabbababbabaaabbabbbbaaababbbabbababbabbababbabaaabbabbbbaaababbbabbababbabbababbabaaabbabbbbaaababbbabbababbabbababbabaaabbabbbbaaababbbabbababbabbababbabaaabbabbbbaaababbbabbababbabbababbabaaabbabbbbaaababbbabbababbabbababbabaaabbab...
output:
88892
result:
ok 1 number(s): "88892"
Test #9:
score: 10
Accepted
time: 1542ms
memory: 95728kb
input:
200000 200000 baaaabaabaaaabaabaaaabaabaaaabaabaaaabaabaaaabaabaaaabaabaaaabaabaaaabaabaaaabaabaaaabaabaaaabaabaaaabaabaaaabaabaaaabaabaaaabaabaaaabaabaaaabaabaaaabaabaaaabaabaaaabaabaaaabaabaaaabaabaaaabaabaaaabaabaaaabaabaaaabaabaaaabaabaaaabaabaaaabaabaaaabaabaaaabaabaaaabaabaaaabaabaaaabaabaaaabaabaaaabaabaaaabaabaaaabaabaaaabaabaaaabaabaaaabaabaaaabaabaaaabaabaaaabaabaaaabaabaaaabaabaaaabaabaaaabaabaaaabaabaaaabaabaaaabaabaaaabaabaaaabaabaaaabaabaaaabaabaaaabaabaaaabaabaaaabaabaaaabaabaaaab...
output:
73785 32397 41165 57 1621 4203 37482 23378 32545 3939 35181 62614 45311 10259 11291 51918 22732 3668 14909 60680 7115 34968 38922 32616 5418 35960 753 5140 23344 31347 51370 20038 27617 30578 18007 63194 5988 59129 8938 41905 14063 60795 40109 37902 46923 60291 22587 37489 56793 29063 42704 14139 8295 58220 29148 27381 12925 18236 1682 12842 36194 16990 10531 13246 19544 4705 57981 31265 520 11051 57725 10602 57361 22722 1734 8939 7943 39282 29941 26495 45647 60281 43777 38306 17456 56793 25420 ...
result:
ok 200000 numbers
Test #10:
score: 10
Accepted
time: 1349ms
memory: 95016kb
input:
200000 200000 aabaabbbbabbbabbbabaaaaaabbbabbaabbababbbabaaaaaabbbabbaabbababbbabaaaaaabbbabbaabbababbbabaaaaaabbbabbaabbababbbabaaaaaabbbabbaabbababbbabaaaaaabbbabbaabbababbbabaaaaaabbbabbaabbababbbabaaaaaabbbabbaabbababbbabaaaaaabbbabbaabbababbbabaaaaaabbbabbaabbababbbabaaaaaabbbabbaabbababbbabaaaaaabbbabbaabbababbbabaaaaaabbbabbaabbababbbabaaaaaabbbabbaabbababbbabaaaaaabbbabbaabbababbbabaaaaaabbbabbaabbababbbabaaaaaabbbabbaabbababbbabaaaaaabbbabbaabbababbbabaaaaaabbbabbaabbababbbabaaaaaabbbab...
output:
90104 36717 44578 16853 6315 27987 42287 63321 15030 76239 29268 67038 24748 326 1693 12333 19290 1950 15891 85493 12053 40517 9213 3333 54430 36751 6448 15811 62510 25453 20811 24477 27918 42397 23486 36671 45747 13253 2573 5007 10519 21013 21557 1373 16766 39902 4386 22371 38472 21513 45747 71823 10558 7253 24647 71626 46267 22824 34716 5232 32488 51476 4230 1293 71356 23085 58830 39753 58798 38483 12212 45669 72116 75550 8865 45479 5890 15530 32413 86438 44015 5413 24771 3293 4950 14110 25605...
result:
ok 200000 numbers