QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#479374#7748. Karshilov's Matching Problem IIucup-team052#WA 84ms25332kbC++142.0kb2024-07-15 16:52:352024-07-15 16:52:35

Judging History

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

  • [2024-08-25 20:42:18]
  • hack成功,自动添加数据
  • (/hack/789)
  • [2024-07-15 16:52:35]
  • 评测
  • 测评结果:WA
  • 用时:84ms
  • 内存:25332kb
  • [2024-07-15 16:52:35]
  • 提交

answer

#include <bits/stdc++.h>
using namespace std;

typedef unsigned long long ull;
typedef long long ll;

const ull base = 10007;
const int N = 150005;

char s[N], t[N];
int w[N], nxt[N], match[N], st[N][18], lg[N];
ll sw[N], sum[N], sum2[N], res[N];
ull hs[N], ht[N], pw[N];
int n, q;

int query(int l, int r) {
	int k = lg[r - l + 1];
	return max(st[l][k], st[r - (1 << k) + 1][k]);
}

ull ghs(int l, int r) {
	return ht[r] - ht[l - 1] * pw[r - l + 1];
}

int main() {
	scanf("%d%d", &n, &q);
	scanf("%s%s", s + 1, t + 1);
	for (int i = 1; i <= n; i++) {
		scanf("%d", &w[i]);
		sw[i] = sw[i - 1] + w[i];
	}
	res[1] = sum[1] = w[1];
	for (int i = 2; i <= n; i++) {
		int k = nxt[i - 1];
		while (k && s[k + 1] != s[i]) k = nxt[k];
		if (s[k + 1] == s[i]) ++k;
		nxt[i] = k;
		sum[i] = w[i] + sum[nxt[i]];
		res[i] = res[i - 1] + sum[i];
	}
	pw[0] = 1;
	for (int i = 1; i <= n; i++) {
		hs[i] = hs[i - 1] * base + s[i];
		ht[i] = ht[i - 1] * base + t[i];
		pw[i] = pw[i - 1] * base;
	}
	for (int i = 1; i <= n; i++) {
		int l = 1, r = n - i + 1, res = 0;
		while (l <= r) {
			int mid = (l + r) >> 1;
			if (ghs(i, i + mid - 1) == hs[mid]) res = mid, l = mid + 1;
			else r = mid - 1;
		}
		match[i] = res;
		// fprintf(stderr, "match[%d] = %d\n", i, match[i]);
	}
	for (int i = 1; i <= n; i++) sum2[i] = sum2[i - 1] + sw[match[i]];
	for (int i = 1; i <= n; i++) st[i][0] = i + match[i] - 1;
	for (int j = 1; j <= 17; j++) {
		for (int i = 1; i <= n - (1 << j) + 1; i++) st[i][j] = max(st[i][j - 1], st[i + (1 << (j - 1))][j - 1]);
	}
	lg[0] = -1;
	for (int i = 1; i <= n; i++) lg[i] = lg[i >> 1] + 1;
	while (q--) {
		int l, r;
		scanf("%d%d", &l, &r);
		if (query(l, r) <= r) printf("%lld\n", sum2[r] - sum2[l - 1]);
		else {
			int L = l, R = r, pos = r;
			while (L <= R) {
				int mid = (L + R) >> 1;
				if (query(l, mid) > r) pos = mid, R = mid - 1;
				else L = mid + 1;
			}
			ll ans = sum2[pos - 1] - sum2[l - 1] + res[r - pos + 1];
			printf("%lld\n", ans);
		}
	}
	return 0;
}

详细

Test #1:

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

input:

8 5
abbabaab
aababbab
1 2 4 8 16 32 64 128
1 1
2 3
3 5
4 7
1 8

output:

1
3
3
16
38

result:

ok 5 lines

Test #2:

score: 0
Accepted
time: 0ms
memory: 9936kb

input:

15 4
heheheheehhejie
heheheheheheheh
3 1 4 1 5 9 2 6 5 3 5 8 9 7 9
2 3
4 8
2 6
1 15

output:

3
13
13
174

result:

ok 4 lines

Test #3:

score: 0
Accepted
time: 76ms
memory: 25200kb

input:

150000 150000
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...

output:

108147037823514
221878585246974
455339807727642
440286198422821
148115747906237
88695249853257
351159618462315
58850354020997
65824434822005
270158033672354
197732558443069
298193894693053
239511187032650
28139154231325
408380171835227
268053430937402
32417121185965
104813548228675
44074926058619
78...

result:

ok 150000 lines

Test #4:

score: 0
Accepted
time: 81ms
memory: 25264kb

input:

150000 150000
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb...

output:

528900815691571
112638556022185
514229554849356
2216206133639915
295388515578381
1658587138269057
652142121207636
166322478628783
490195029871161
1191292846892788
1468501126902703
487990867773908
55994169916421
568966315599642
2522992078581539
2339888502167342
2881203249819745
154700081279584
152537...

result:

ok 150000 lines

Test #5:

score: 0
Accepted
time: 84ms
memory: 25144kb

input:

150000 150000
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...

output:

386150762496368
2769669390423140
1025785181073675
1707930121656247
332135612349048
113937878332307
1128519694119799
476402941643931
980441978140407
1004994648999517
676169371268202
2607965889355671
273766796671958
711480908011402
71754482763611
400453994282744
975387094872830
810536618300388
2229061...

result:

ok 150000 lines

Test #6:

score: 0
Accepted
time: 84ms
memory: 25180kb

input:

150000 150000
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb...

output:

25254725752128652
23497896664383313
15195391464047263
41143572895791434
7513384536045842
8871310939247699
17423823866879881
14601201534396958
6203483865940624
24953281161800570
24776576029495768
1687640411226
31563282955464371
29947970968962218
1149303801639767
5806503923049299
11201332188941891
116...

result:

ok 150000 lines

Test #7:

score: 0
Accepted
time: 83ms
memory: 25332kb

input:

150000 150000
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...

output:

4570597927951323
11761063519994765
289982253793476
15684854914181269
19579321543184889
459972639580770
15246459216963247
1833393949769247
22425556248999709
11209560100586843
2883954996867615
14371655418173335
29207399108721
5943079608253242
1664456073054861
27405606916506455
23082758946788297
381175...

result:

ok 150000 lines

Test #8:

score: 0
Accepted
time: 64ms
memory: 25140kb

input:

150000 150000
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...

output:

5697498028074951
21822720964918437
11237472002329727
84315407720465773
32198634509153899
40728716039967676
5913555967331675
10487781019914529
270012821917938205
239347797488036653
216168445985667902
67452321725546144
457298584810665039
187789940805492303
46241700003064393
242312618101113
42260337439...

result:

ok 150000 lines

Test #9:

score: -100
Wrong Answer
time: 68ms
memory: 25304kb

input:

150000 150000
abbabaabbaababbabaababbaabbabaabbaababbaabbabaababbabaabbaababbabaababbaabbabaababbabaabbaababbaabbabaabbaababbabaababbaabbabaabbaababbaabbabaababbabaabbaababbaabbabaabbaababbabaababbaabbabaababbabaabbaababbabaababbaabbabaabbaababbaabbabaababbabaabbaababbabaababbaabbabaababbabaabbaabab...

output:

27886204710936
12938936978611
8992557949260
31808665411839
67573663906133
14464199942876
11907416223800
4769980618064
26882898915917
48258171215233
8829259447682
145195100280608
259911742133137
36638533723714
23036700359281
39332872912057
9865821516127
8938366531100
84698671913438
7567003686052
1435...

result:

wrong answer 1st lines differ - expected: '20591954951726', found: '27886204710936'