QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#631278 | #21648. Runs | pskkk | 100 ✓ | 640ms | 72232kb | C++23 | 3.2kb | 2024-10-11 23:41:46 | 2024-10-11 23:41:46 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
struct Runs {
int l, r, p;
bool operator==(const Runs &j) {
return l == j.l && r == j.r && p == j.p;
}
};
const int mod = 998244353, mod1 = 1e9 + 7, mod2 = 1e9 + 9;
const int bas1 = 315, bas2 = 79;
const int maxn = 2e6 + 5;
char t[maxn];
int m;
namespace getRuns {
struct Hash {
long long p[maxn], h[maxn];
int mod, buf;
Hash(int _buf, int _mod) {
buf = _buf;
mod = _mod;
}
void Init(char *s, int n) {
p[0] = 1;
h[0] = 0;
for (int i = 1; i <= n; i++) {
p[i] = p[i - 1] * buf % mod;
h[i] = (h[i - 1] * buf + s[i] - 'a' + 1) % mod;
}
}
bool tl(int u, int v, int len) {
return (h[u] - h[v] + (h[v - len] - h[u - len]) * p[len]) % mod == 0;
}
bool tr(int u, int v, int len) {
return (h[u + len - 1] - h[v + len - 1] + (h[v - 1] - h[u - 1]) * p[len]) % mod == 0;
}
int get(int l, int r) {
return (h[r] + (mod - h[l - 1]) * p[r - l + 1] % mod) % mod;
}
} h1(bas1, mod1), h2(bas2, mod2);
int extr(int x, int y) {
int l = 0, r = m - max(x, y) + 1, res = 0;
while (l <= r) {
int mid = l + r >> 1;
if (h1.tr(x, y, mid) && h2.tr(x, y, mid)) {
res = mid;
l = mid + 1;
} else
r = mid - 1;
}
return res;
}
int extl(int x, int y) {
int l = 0, r = min(x, y), res = 0;
while (l <= r) {
int mid = l + r >> 1;
if (h1.tl(x, y, mid) && h2.tl(x, y, mid)) {
res = mid;
l = mid + 1;
} else
r = mid - 1;
}
return res;
}
vector<Runs> raw_runs(0);
int CMP(int x, int y) {
if (x == y)
return 0;
int l = extr(x, y);
return t[x + l] < t[y + l] ? -1 : 1;
}
void Check(int i, int j) {
int p = j - i + 1;
int x = i - extl(i - 1, j), y = j + extr(i, j + 1);
if (y - x + 1 >= p * 2)
raw_runs.push_back({x, y, p});
}
int st[maxn], top;
void init() {
for (int i = m; i; i--) {
while (top && CMP(i, st[top]) <= 0)
top--;
if (top)
Check(i, st[top] - 1);
st[++top] = i;
}
top = 0;
for (int i = m; i; i--) {
while (top && CMP(i, st[top]) >= 0)
top--;
if (top)
Check(i, st[top] - 1);
st[++top] = i;
}
}
} // namespace getRuns
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> t;
m = strlen(t);
for (int i = m; i >= 1; --i) {
t[i] = t[i - 1];
}
getRuns::h1.Init(t, m);
getRuns::h2.Init(t, m);
getRuns::init();
sort(getRuns::raw_runs.begin(), getRuns::raw_runs.end(), [](const Runs &A, const Runs &B) {
return A.l == B.l ? (A.r == B.r ? A.p < B.p : A.r < B.r) : A.l < B.l;
});
int tot = std::unique(getRuns::raw_runs.begin(), getRuns::raw_runs.end()) - getRuns::raw_runs.begin();
cout << tot << '\n';
getRuns::raw_runs.resize(tot);
for (auto [l, r, p] : getRuns::raw_runs)
cout << l << " " << r << " " << p << '\n';
}
Details
Tip: Click on the bar to expand more detailed information
Pretests
Final Tests
Test #1:
score: 10
Accepted
time: 89ms
memory: 20176kb
input:
luynenolgrtkiqkdbpcoqsjyisilepmrkleqytdfmxrupcartchjwqhekspohcftpmkpfnwtmoqesqxluevqwewgylwgpdbgplwwbsqpigtayqmswjksngymtwulavrpjpomiedsmxtmpheoqogfwhtpdnaflsxwhlkrrnkfmfrcmvqelyjhfdylszqftndcynurbgwnnnrbkjfxioeptfaoervxgzzhovypdvfsiytviysqpzhkeiyibwhjviqjgpblmieugxroykgnloxpyyzzugirqbcwqdicloyulqij...
output:
7394 99 100 1 164 165 1 200 202 1 222 223 1 277 278 1 279 280 1 334 335 1 406 407 1 410 411 1 412 413 1 421 422 1 434 435 1 458 459 1 494 495 1 559 560 1 564 565 1 566 567 1 577 578 1 624 625 1 633 634 1 704 705 1 706 707 1 710 711 1 749 750 1 769 770 1 797 798 1 800 801 1 858 859 1 866 867 1 868 86...
result:
ok 7395 lines
Test #2:
score: 10
Accepted
time: 87ms
memory: 24652kb
input:
qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq...
output:
1 1 200000 1
result:
ok 2 lines
Test #3:
score: 10
Accepted
time: 106ms
memory: 24784kb
input:
bbccaaababbbbccaaababbbbccabbccaaababbbbccaaababbbbccabbccaaababbbbccabbccaaababbbbccaaababbbbccabbccaaababbbbccaaababbbbccabbccaaababbbbccabbccaaababbbbccaaababbbbccabbccaaababbbbccabbccaaababbbbccaaababbbbccabbccaaababbbbccaaababbbbccabbccaaababbbbccabbccaaababbbbccaaababbbbccabbccaaababbbbccaaaba...
output:
102706 1 2 1 1 27 11 1 70 27 1 183 70 1 479 183 1 1254 479 1 3283 1254 1 8595 3283 1 22502 8595 1 58911 22502 1 154231 58911 3 4 1 5 7 1 7 10 2 10 13 1 12 43 16 12 113 43 12 296 113 12 775 296 12 2029 775 12 5312 2029 12 13907 5312 12 36409 13907 12 95320 36409 12 200000 95320 14 15 1 16 18 1 18 21 ...
result:
ok 102707 lines
Test #4:
score: 10
Accepted
time: 99ms
memory: 21196kb
input:
dcbaabcdabcddcbaabcdabcddcbadcbaabcdabcddcbaabcdabcddcbadcbaabcdabcddcbadcbaabcdabcddcbaabcdabcddcbadcbaabcdabcddcbaabcdabcddcbadcbaabcdabcddcbadcbaabcdabcddcbaabcdabcddcbadcbaabcdabcddcbadcbaabcdabcddcbaabcdabcddcbadcbaabcdabcddcbaabcdabcddcbadcbaabcdabcddcbadcbaabcdabcddcbaabcdabcddcbadcbaabcdabcd...
output:
69092 1 28 12 1 72 28 1 188 72 1 492 188 1 1288 492 1 3372 1288 1 8828 3372 1 23112 8828 1 60508 23112 1 158412 60508 4 5 1 5 12 4 12 13 1 13 44 16 13 116 44 13 304 116 13 796 304 13 2084 796 13 5456 2084 13 14284 5456 13 37396 14284 13 97904 37396 13 200000 97904 16 17 1 17 24 4 24 25 1 25 32 4 29 ...
result:
ok 69093 lines
Test #5:
score: 10
Accepted
time: 0ms
memory: 13952kb
input:
dcbaabcdabcddcbaabcdabcddcbadcbaabcdabcddcbaabcdabcddcbadcbaabcdabcddcbadcbaabcdabcddcbaabcdabcddcba
output:
31 1 28 12 1 72 28 4 5 1 5 12 4 12 13 1 13 44 16 13 100 44 16 17 1 17 24 4 24 25 1 25 32 4 29 56 12 32 33 1 33 40 4 40 41 1 41 88 16 44 45 1 45 52 4 52 53 1 53 60 4 60 61 1 61 68 4 68 69 1 69 76 4 73 100 12 76 77 1 77 84 4 84 85 1 88 89 1 89 96 4 96 97 1
result:
ok 32 lines
Test #6:
score: 10
Accepted
time: 121ms
memory: 25364kb
input:
bbabaababaababbbbabaababaababbbbabbbabaababaababbbbabaababaababbbbabbbabaababaababbbbabbbabaababaababbbbabaababaababbbbabbbabaababaababbbbabaababaababbbbabbbabaababaababbbbabbbabaababaababbbbabaababaababbbbabbbabaababaababbbbabbbabaababaababbbbabaababaababbbbabbbabaababaababbbbabaababaababbbbabbbaba...
output:
140058 1 2 1 1 34 15 1 87 34 1 227 87 1 594 227 1 1555 594 1 4071 1555 1 10658 4071 1 27903 10658 1 73051 27903 1 191250 73051 2 5 2 2 14 5 3 8 3 5 6 1 6 10 2 8 13 3 10 11 1 11 14 2 14 17 1 15 53 19 15 140 53 15 367 140 15 961 367 15 2516 961 15 6587 2516 15 17245 6587 15 45148 17245 15 118199 45148...
result:
ok 140059 lines
Test #7:
score: 10
Accepted
time: 484ms
memory: 45808kb
input:
ghbaahxvveloseywqeuokpraqgyscdcimfioohjjnwyhdyftczjorapjhncjqetfjetxnfidbgkeesajrjxkkmutayescxxndtmryuubdgijyisstqefcayeycxccwpfpdypautdbbmblfvexakzakgzpfdrdtytyzkytfdwgqarxvyuvivysbzhgcakxbfwarwvxaufsuzprxjnhenbimlqoncmojkqbgoaiifaegpvdakmhxoplzfamkodtatwghwprerxkhtqhfcofqfqrnsgxgjsgcppmlgfrxdceyuo...
output:
38316 4 5 1 8 9 1 36 37 1 39 40 1 76 77 1 84 85 1 94 95 1 102 103 1 111 112 1 124 125 1 137 138 1 158 161 2 229 230 1 273 276 2 287 288 1 342 344 1 352 353 1 412 413 1 449 450 1 458 459 1 463 464 1 514 516 1 564 565 1 588 589 1 621 622 1 630 631 1 653 654 1 678 679 1 682 683 1 689 690 1 776 779 1 78...
result:
ok 38317 lines
Test #8:
score: 10
Accepted
time: 468ms
memory: 62564kb
input:
pppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppp...
output:
1 1 999998 1
result:
ok 2 lines
Test #9:
score: 10
Accepted
time: 603ms
memory: 72232kb
input:
aababbbbccabbccaaababbbbccabbccaaababbbbccaaababbbbccabbccaaababbbbccabbccaaababbbbccaaababbbbccabbccaaababbbbccaaababbbbccabbccaaababbbbccabbccaaababbbbccaaababbbbccabbccaaababbbbccabbccaaababbbbccaaababbbbccabbccaaababbbbccaaababbbbccabbccaaababbbbccabbccaaababbbbccaaababbbbccabbccaaababbbbccaaaba...
output:
513547 1 2 1 1 43 16 1 113 43 1 296 113 1 775 296 1 2029 775 1 5312 2029 1 13907 5312 1 36409 13907 1 95320 36409 1 249551 95320 1 653333 249551 2 5 2 5 8 1 7 16 5 9 10 1 12 13 1 12 70 27 12 183 70 12 479 183 12 1254 479 12 3283 1254 12 8595 3283 12 22502 8595 12 58911 22502 12 154231 58911 12 40378...
result:
ok 513548 lines
Test #10:
score: 10
Accepted
time: 640ms
memory: 69564kb
input:
aababaababbbbabbbabaababaababbbbabbbabaababaababbbbabaababaababbbbabbbabaababaababbbbabbbabaababaababbbbabaababaababbbbabbbabaababaababbbbabaababaababbbbabbbabaababaababbbbabbbabaababaababbbbabaababaababbbbabbbabaababaababbbbabbbabaababaababbbbabaababaababbbbabbbabaababaababbbbabaababaababbbbabbbaba...
output:
700312 1 2 1 1 10 5 1 53 19 1 140 53 1 367 140 1 961 367 1 2516 961 1 6587 2516 1 17245 6587 1 45148 17245 1 118199 45148 1 309449 118199 1 810148 309449 2 6 2 4 9 3 6 7 1 7 10 2 8 17 5 10 13 1 11 19 4 15 17 1 15 87 34 15 227 87 15 594 227 15 1555 594 15 4071 1555 15 10658 4071 15 27903 10658 15 730...
result:
ok 700313 lines