QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#603711#7901. Basic Substring Structureucup-team2112#TL 932ms5860kbC++205.2kb2024-10-01 18:27:352024-10-01 18:27:35

Judging History

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

  • [2024-10-01 18:27:35]
  • 评测
  • 测评结果:TL
  • 用时:932ms
  • 内存:5860kb
  • [2024-10-01 18:27:35]
  • 提交

answer

#include <bits/stdc++.h>

using i64 = long long;

template<int m1, int m2>
struct Hash {
    int x, y;
    Hash(i64 a, i64 b): x(a % m1), y(b % m2) {
        if (x < 0) x += m1;
        if (y < 0) y += m2;
    }
    Hash(i64 a = 0): Hash(a, a) {}

    using H = Hash;
    static int norm(int x, int mod) { return x >= mod ? x - mod : x < 0 ? x + mod : x; }
    friend H operator +(H a, H b) { a.x = norm(a.x + b.x, m1); a.y = norm(a.y + b.y, m2); return a; }
    friend H operator -(H a, H b) { a.x = norm(a.x - b.x, m1); a.y = norm(a.y - b.y, m2); return a; }
    friend H operator *(H a, H b) { return H{1ll * a.x * b.x, 1ll * a.y * b.y}; }
    
    friend bool operator ==(H a, H b) { return std::tie(a.x, a.y) == std::tie(b.x, b.y); }
    friend bool operator !=(H a, H b) { return std::tie(a.x, a.y) != std::tie(b.x, b.y); }
    friend bool operator <(H a, H b) { return std::tie(a.x, a.y) < std::tie(b.x, b.y); }
};
using hashv = Hash<1000000007, 1000050131>;

struct Fenwick_Tree{
    std::vector<hashv> c;
    int n;
    Fenwick_Tree(int n) : n(n) {
        c.resize(n + 1);
    }
    void add(int x, hashv y) {
        for (int i = x; i <= n; i += i & -i) {
            c[i] = c[i] + y;
        }
    }
    hashv query(int x) {
        hashv res = (0, 0);
        for (int i = x; i > 0; i -= i & -i) {
            res = res + c[i];
        }
        return res;
    }
};

void solve(){
    int n;
    std::cin >> n;
    std::vector<hashv> bin(n + 1);
    std::vector<int> a(n + 1);
    bin[0] = hashv(1, 1);
    Fenwick_Tree tree(n);
    for (int i = 1; i <= n; i += 1){
        bin[i] = bin[i - 1] * hashv(233, 13331);
        int x;
        std::cin >> x;
        tree.add(i, hashv(x, x) * bin[i]);
        a[i] = x;
    }

    auto modify = [&](int i, int v){
        tree.add(i, hashv(-a[i], -a[i]) * bin[i]);
        a[i] = v;
        tree.add(i, hashv(a[i], a[i]) * bin[i]);
    };

    auto lcp = [&](int i, int j) {
        int hi = n - std::max(i, j) + 1;
        int lo = 1, ans = 0;
        while(hi >= lo) {
            int mid = lo + hi >> 1;
            if ((tree.query(i + mid - 1) - tree.query(i - 1)) * bin[j] == (tree.query(j + mid - 1) - tree.query(j - 1)) * bin[i]) {
                lo = mid + 1;
                ans = mid;
            }
            else {
                hi = mid - 1;
            }
        }
        return ans;
    };

    
    std::vector e1(n + 2, std::vector<std::tuple<int, int, int> >()) ;
    std::vector e2(n + 2, std::vector<std::pair<int, int> >()) ;
    i64 sum = 0;
    for (int i = 1; i <= n; i += 1){
        sum += lcp(1, i);
    }

    auto add_e1 = [&](int l, int r, int c) {
        if (l > r) return;
        // if (l <= 4 && 4 <= r) std::cerr << "e1: " << l << " " << r << " " << c << "\n";
        e1[l].emplace_back(1, l, c);
        e1[r + 1].emplace_back(-1, l, c);
    };

    auto add_e2 = [&](int x, int v, int c) {
        // if (x == 4) std::cerr << "e2: " << x << " " << v << " " << c << "\n";
        e2[x].emplace_back(v, c);
    };

    for (int i = 2; i <= n; i += 1) {
        int x = lcp(1, i);
        if (x < i) {
            add_e1(1, x, x);
            add_e1(i, i + x - 1, x);
            if (i + x <= n) {
                int t = a[i + x];
                modify(i + x, a[x + 1]);
                int y = lcp(1, i) - x;
                modify(i + x, t);
                
                // std::cerr << "!\n";
                add_e2(i + x, a[x + 1], y);
                if (x + 1 != i) {
                    t = a[x + 1];
                    modify(x + 1, a[i + x]);
                    y = lcp(1, i) - x;
                    modify(x + 1, t);

                    // std::cerr << "?\n";
                    add_e2(x + 1, a[x + i], y);
                }
            }
        }
        else {
            add_e1(1, i - 1, x);
            add_e1(i, i + x - 1, x);
            if (i + x <= n) {
                int t = a[i + x];
                modify(i + x, a[x + 1]);
                int y = lcp(1, i) - x;
                add_e2(i + x, a[x + 1], y);
                modify(i + x, t);
            }
        }
    }

    i64 cnt = 0;
    i64 delta = 0;
    i64 ans = 0;
    for (int i = 1; i <= n; i += 1) {
        for (auto [t, l, c] : e1[i]) {
            cnt += t;
            delta -= t * (l + c);
        }
        i64 res = sum + delta + 1ll * i * cnt;
        std::sort(e2[i].begin(), e2[i].end());
        for (int j = 0; j < e2[i].size(); j += 1) {
            int k = j;
            i64 bonus = 0;
            while(k < e2[i].size() && e2[i][j].first == e2[i][k].first) {
                bonus += e2[i][k].second;
                k += 1;
            }
            // std::cerr << i << " " << sum << " " << delta << " " << bonus << " " << cnt << "\n";
            res = std::max(res, sum + delta + bonus + 1ll * i * cnt);
            j = k - 1;
        }
        // std::cout << res << " \n"[i == n];
        ans += res ^ i;
    }
    std::cout << ans << "\n";
}

int main(){
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    std::cout.tie(nullptr);
    int T;
    std::cin >> T;
    while(T--) solve();
    return 0;
}

详细

Test #1:

score: 100
Accepted
time: 1ms
memory: 3564kb

input:

2
4
2 1 1 2
12
1 1 4 5 1 4 1 9 1 9 8 10

output:

15
217

result:

ok 2 lines

Test #2:

score: 0
Accepted
time: 53ms
memory: 3580kb

input:

10000
8
2 1 2 1 1 1 2 2
9
2 2 1 2 1 2 1 2 1
15
2 1 2 1 1 1 1 2 2 1 2 1 2 2 1
2
1 1
10
2 1 1 1 2 2 1 1 2 2
3
2 1 2
11
1 2 2 1 1 2 1 2 2 1 1
14
2 1 1 1 1 2 1 1 1 2 2 1 2 1
12
2 2 2 1 2 2 2 1 1 2 1 2
4
2 1 1 2
8
1 2 2 2 1 2 1 1
8
1 1 2 1 2 1 1 1
6
2 1 1 1 2 2
14
2 2 1 1 1 1 2 2 2 1 2 2 1 1
10
1 2 2 1 1...

output:

94
128
347
3
211
9
265
363
278
15
95
114
58
348
225
3
335
364
377
316
3
19
122
66
15
83
36
258
11
63
28
90
85
103
252
191
21
48
303
63
102
20
24
68
316
362
266
309
355
281
326
281
231
312
3
330
54
328
3
69
32
147
322
39
338
90
242
3
165
346
245
20
155
3
404
393
392
81
269
360
20
54
21
279
3
17
351
3...

result:

ok 10000 lines

Test #3:

score: 0
Accepted
time: 119ms
memory: 3844kb

input:

10000
17
1 2 2 2 2 2 2 2 1 1 2 2 1 2 1 2 2
17
2 1 1 1 1 2 2 2 1 1 1 1 1 2 2 2 2
13
2 2 2 1 2 2 2 2 1 1 1 1 1
12
2 2 1 2 1 2 2 1 1 1 1 1
13
2 2 2 1 1 1 1 2 2 2 2 1 1
20
2 1 2 2 1 2 2 2 2 2 2 1 2 2 2 2 1 2 1 1
13
1 2 1 2 2 2 1 2 1 2 1 1 1
20
2 1 1 2 2 1 2 2 1 1 2 1 2 2 2 2 2 1 2 2
12
2 1 2 1 1 2 2 1 2...

output:

392
434
308
252
302
895
343
867
282
249
717
194
252
350
230
427
439
279
340
384
380
292
218
312
271
810
275
211
460
388
365
342
773
203
238
857
720
497
514
443
618
777
372
242
337
232
324
837
289
480
366
681
358
281
320
529
451
309
250
326
315
744
307
841
133
214
411
788
332
365
488
157
760
278
421
...

result:

ok 10000 lines

Test #4:

score: 0
Accepted
time: 116ms
memory: 3648kb

input:

10000
10
3 3 1 2 2 3 3 3 2 3
13
1 2 1 2 1 1 3 1 2 2 1 3 1
14
1 2 1 2 3 3 2 3 1 2 2 2 3 3
10
1 1 1 1 1 1 3 2 1 2
19
1 3 3 3 1 3 3 2 1 1 1 3 2 2 1 2 1 3 2
12
1 3 1 3 1 1 3 2 3 3 2 3
11
1 1 1 2 2 3 1 1 3 1 1
12
3 2 2 1 3 3 2 1 1 3 3 2
11
2 2 3 2 3 1 3 1 2 1 1
20
3 1 2 2 3 1 3 3 1 3 3 2 3 3 3 2 3 1 1 2
...

output:

191
285
325
207
420
281
215
280
151
754
365
199
94
418
318
377
414
285
373
362
111
358
332
117
185
326
89
404
229
386
307
285
421
232
321
329
506
372
386
364
153
582
313
356
152
129
424
366
382
280
363
370
273
294
388
389
807
388
459
280
114
310
211
368
150
166
793
211
793
393
102
427
399
408
584
38...

result:

ok 10000 lines

Test #5:

score: 0
Accepted
time: 110ms
memory: 3884kb

input:

10000
14
9 9 13 6 3 8 7 10 5 9 14 2 12 5
15
9 12 2 2 8 4 2 11 4 4 8 3 8 13 15
19
5 7 1 2 9 2 16 9 15 8 19 9 3 18 8 8 1 12 6
14
9 8 2 11 7 2 12 5 14 14 10 5 7 2
11
4 4 2 9 9 11 10 3 3 2 2
14
8 2 9 10 10 11 6 9 12 5 5 4 9 2
20
4 5 3 13 15 18 12 6 2 8 11 12 6 10 14 14 10 14 13 12
14
11 9 7 5 12 12 5 3 ...

output:

307
362
380
107
97
137
380
108
135
299
312
265
99
362
379
361
332
380
129
367
97
380
97
107
363
107
132
367
97
88
363
314
100
382
354
349
383
95
359
306
340
133
382
106
395
361
374
105
292
385
360
359
365
381
378
107
374
111
357
105
365
319
379
102
364
89
107
374
128
101
360
115
363
107
106
116
92
3...

result:

ok 10000 lines

Test #6:

score: 0
Accepted
time: 376ms
memory: 3716kb

input:

1331
128
1 1 2 1 1 1 1 1 1 1 1 1 1 2 2 2 1 1 2 1 2 2 1 1 2 1 2 1 2 1 2 2 1 2 1 2 2 2 1 2 1 2 2 2 2 2 1 2 1 2 2 1 1 2 2 1 1 1 1 2 2 1 1 2 1 1 1 1 1 2 1 1 1 1 1 1 1 2 2 2 2 2 1 2 1 2 1 2 2 1 1 2 1 1 2 2 2 1 1 2 2 2 1 2 2 2 1 2 1 1 1 2 2 1 1 1 2 1 1 1 1 1 1 1 2 2 2 2
115
1 2 2 1 2 2 1 2 2 1 2 1 2 2 2 1...

output:

41073
22779
19964
77764
77960
62759
68522
21651
24781
42049
74437
19840
74378
68878
20605
34809
20231
20004
50820
29156
52217
53156
23540
67367
57400
46500
19870
60423
66032
51371
59540
51300
48277
22751
77712
65779
21946
37124
65635
40091
27911
55656
54005
18564
25013
64077
46260
21753
62329
69899
...

result:

ok 1331 lines

Test #7:

score: 0
Accepted
time: 619ms
memory: 3912kb

input:

131
1471
2 3 2 3 1 2 2 1 1 1 1 2 1 3 2 1 1 1 2 2 2 2 2 2 3 1 3 2 1 2 3 2 3 1 3 1 2 1 3 1 3 1 3 2 2 1 3 3 3 1 1 1 3 2 2 2 1 2 1 3 1 3 3 1 2 2 1 2 3 1 3 1 3 3 2 1 3 3 2 3 2 2 2 1 3 2 1 2 2 1 3 1 1 3 2 3 1 1 2 1 2 3 2 1 3 3 2 2 2 2 1 1 1 2 3 1 1 3 3 2 3 2 1 3 1 3 3 2 2 1 2 1 1 2 1 3 2 1 2 2 3 2 2 1 1 3...

output:

4103972
1822893
4056671
4581950
1797128
5452459
5578024
6135700
4325429
1769997
1239977
1589696
5346072
1818448
5380837
3882106
3814365
1823901
4911982
5946018
5208392
4261893
1767953
5781183
4624024
1795249
1600563
1677098
4679442
4113663
1685240
1576241
5128042
1618422
4440641
4326472
5703872
3748...

result:

ok 131 lines

Test #8:

score: 0
Accepted
time: 590ms
memory: 3812kb

input:

131
1104
15 10 15 18 8 16 25 26 11 19 4 5 9 15 20 8 8 1 5 12 6 15 15 9 19 6 20 8 9 10 12 1 7 26 9 15 26 14 18 24 25 4 9 20 16 18 25 10 8 2 15 14 26 19 22 17 8 7 23 19 22 26 23 4 26 8 16 6 19 5 17 4 9 25 7 14 19 26 9 21 23 7 20 2 12 22 23 24 20 11 23 23 7 13 6 26 25 10 8 17 23 15 14 20 16 7 21 8 11 1...

output:

1585911
1671116
2074604
2071604
2066710
1571959
1699180
1597972
1573443
2062834
1968749
1670339
1696389
1700722
1574014
1673122
6093159
1965764
1966052
2084891
1597710
1989656
2054890
1659456
1601397
1982947
1675608
2075393
1694022
1992153
6012239
1675824
1987812
1589514
2063346
1986943
1571712
1671...

result:

ok 131 lines

Test #9:

score: 0
Accepted
time: 932ms
memory: 5860kb

input:

14
554
232 178 169 417 93 38 93 537 212 211 313 227 432 269 475 489 459 286 318 534 118 160 223 534 275 382 482 331 3 279 73 513 403 277 34 497 462 397 280 218 395 498 201 548 8 520 495 397 545 528 401 58 418 3 494 260 251 496 212 552 243 151 78 385 441 73 271 337 283 39 162 1 501 357 126 452 416 34...

output:

394027
127388087
408947528
132597056
403149770
403022905
410881136
404226176
134192573
106965642
108543004
108541542
109002658
408924618

result:

ok 14 lines

Test #10:

score: -100
Time Limit Exceeded

input:

1
200000
86045 57533 29508 181370 17680 186294 134595 82393 109229 189798 133533 194579 11412 112604 572 32659 76824 177596 106427 60375 98302 93821 34541 125615 108609 22507 166292 195457 151376 54630 166314 85832 192590 85410 149595 46737 54738 198246 56457 189628 135013 63949 28359 65601 162502 4...

output:


result: