UOJ Logo

NOI.AC

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#199160#2131. rokutkswls1001123ms110608kbC++112.1kb2023-12-05 11:20:332023-12-05 12:07:22

answer

#include <bits/stdc++.h>
#pragma GCC optimize(2)
using namespace std;
int n, f[200005], a[200005], rt[200005], fail[200005];
struct node {
	int name, num;
};
vector<node> son[200005];
struct XDN {
	int l, r, ls, rs, num = 0;
} b[5000006];
int ccnt = 0;
inline void insert(int p, int l, int r, int q, int w) {
	b[p].l = l, b[p].r = r;
	if (l == r) {
		b[p].num = w;
		return;
	}
	if (q <= ((l + r) >> 1)) {
		b[p].ls = ++ccnt;
		insert(ccnt, l, (l + r) >> 1, q, w);
	} else {
		b[p].rs = ++ccnt;
		insert(ccnt, ((l + r) >> 1) + 1, r, q, w);
	}
}
inline int change(int p, int q, int w) {
	b[++ccnt] = b[p];
	p = ccnt;
	if (b[p].l == b[p].r) {
		b[p].num = w;
		return p;
	}
	if (q <= (b[p].l + b[p].r) / 2) {
		if (!b[p].ls) {
			b[p].ls = ++ccnt;
			insert(ccnt, (b[p].l), (b[p].l + b[p].r) >> 1, q, w);
		} else {
			b[p].ls = change(b[p].ls, q, w);
		}
	} else {
		if (!b[p].rs) {
			b[p].rs = ++ccnt;
			insert(ccnt, ((b[p].l + b[p].r) >> 1) + 1, b[p].r, q, w);
		} else {
			b[p].rs = change(b[p].rs, q, w);
		}
	}
	return p;
}
inline int query(int p, int q) {
	if (b[p].l == b[p].r) return b[p].num;
	if (q <= (b[p].l + b[p].r) / 2) {
		if (!b[p].ls) return 0;
		return query(b[p].ls, q);
	} else {
		if (!b[p].rs) return 0;
		return query(b[p].rs, q);
	}
}
signed main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin >> n;
	for (int i = 1; i <= n; i++) {
		cin >> f[i];
	}
	for (int i = 1; i <= n; i++) {
		cin >> a[i];
		son[f[i]].push_back(node{a[i], i});
	}
	ccnt = 1;
	b[1].l = 1, b[1].r = n;
	rt[0] = 1;
	for (int i = 0; i < son[0].size(); i++) {
		rt[0] = change(rt[0], son[0][i].name, son[0][i].num);
	}
	queue<int> q;
	for (int i = 0; i < son[0].size(); i++) {
		q.push(son[0][i].num);
	}
	while (q.size()) {
		int i = q.front();
		q.pop();
		if (f[i] == 0) {
			fail[i] = 0;
		} else {
			fail[i] = query(rt[fail[f[i]]], a[i]);
		}
		rt[i] = rt[fail[i]];
		for (int j = 0; j < son[i].size(); j++) {
			rt[i] = change(rt[i], son[i][j].name, son[i][j].num);
			q.push(son[i][j].num);
		}
	}
	for (int i = 1; i <= n; i++) {
		cout << fail[i] << ' ';
	}
}

详细

小提示:点击横条可展开更详细的信息

Subtask #1:

score: 30
Accepted

Test #1:

score: 30
Accepted
time: 8ms
memory: 103640kb

input:

20
0 0 0 0 0 2 1 4 2 5 9 11 12 3 14 6 1 7 8 6
13 10 16 3 2 3 2 2 2 2 2 2 2 2 2 3 3 2 2 2

output:

0 0 0 0 0 4 5 5 5 5 10 10 10 5 10 4 4 10 10 8 

result:

ok 20 numbers

Test #2:

score: 0
Accepted
time: 7ms
memory: 103652kb

input:

200
0 1 0 2 4 5 0 2 8 2 3 0 1 3 8 14 13 16 12 14 7 7 6 23 11 0 19 1 13 16 12 21 8 6 5 1 22 4 15 24 4...

output:

0 3 0 1 74 12 0 14 3 99 54 0 54 26 20 56 3 57 54 85 26 12 19 69 90 0 90 1 1 112 3 85 16 68 26 12 44 ...

result:

ok 200 numbers

Test #3:

score: 0
Accepted
time: 12ms
memory: 103720kb

input:

2000
0 1 1 1 1 4 5 1 0 2 10 2 7 8 8 11 11 13 0 4 11 11 10 9 7 5 4 23 12 20 17 29 13 20 29 12 23 29 3...

output:

0 0 85 0 19 0 1476 296 0 1800 19 9 43 1800 296 1476 85 88 0 0 9 19 1800 0 8 237 85 0 24 1 9 9 864 29...

result:

ok 2000 numbers

Subtask #2:

score: 70
Accepted

Test #4:

score: 70
Accepted
time: 181ms
memory: 110604kb

input:

200000
0 1 0 0 4 3 5 4 0 6 10 4 3 12 1 11 1 6 12 15 14 5 6 6 5 9 11 18 17 18 16 22 28 33 19 18 19 3 ...

output:

0 79 0 0 1050 9 7058 9 0 844 15965 830 10823 9147 9 152147 535 119 41447 26 1924 0 10823 101 0 1 326...

result:

ok 200000 numbers

Test #5:

score: 0
Accepted
time: 182ms
memory: 110604kb

input:

200000
0 1 0 0 2 3 5 3 4 9 2 4 7 3 8 8 3 15 15 9 8 6 4 12 1 14 8 3 9 17 18 20 0 7 3 11 20 1 36 35 35...

output:

0 1 0 0 2423 33 147931 67 581 8281 100716 446 40934 446 150 33 38169 6195 142024 8674 385 143 33 187...

result:

ok 200000 numbers

Test #6:

score: 0
Accepted
time: 157ms
memory: 110608kb

input:

200000
0 0 1 1 1 4 0 3 5 9 9 9 7 6 7 5 7 0 18 12 14 5 7 10 18 12 5 25 5 7 0 17 15 33 10 1 7 22 11 36...

output:

0 0 8607 18 155 19 0 26798 5602 8607 52496 47618 7 3192 47618 165108 1303 0 1 1881 12040 33654 155 8...

result:

ok 200000 numbers

Test #7:

score: 0
Accepted
time: 163ms
memory: 109952kb

input:

200000
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 3...

output:

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36...

result:

ok 200000 numbers

Test #8:

score: 0
Accepted
time: 144ms
memory: 109952kb

input:

200000
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 3...

output:

0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 ...

result:

ok 200000 numbers

Test #9:

score: 0
Accepted
time: 133ms
memory: 110212kb

input:

200000
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 3...

output:

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ...

result:

ok 200000 numbers

Test #10:

score: 0
Accepted
time: 136ms
memory: 110208kb

input:

200000
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 3...

output:

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ...

result:

ok 200000 numbers