QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#34619#4235. TransparencyYaoBIG#AC ✓30ms3848kbC++5.3kb2022-06-11 23:55:212022-06-11 23:55:22

Judging History

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

  • [2023-08-10 23:21:45]
  • System Update: QOJ starts to keep a history of the judgings of all the submissions.
  • [2022-06-11 23:55:22]
  • 评测
  • 测评结果:AC
  • 用时:30ms
  • 内存:3848kb
  • [2022-06-11 23:55:21]
  • 提交

answer

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ull = unsigned long long;

// For every pair of nodes, find shortest path using only small characters, and a distinct shortest path using only small characters
// For every pair of nodes, find shortest path to the goal such that both have the same large letters on the path, and sum of small letter count is minimised.
// 	Then, do the same, but this time guarantee that the strings produced by the walks are distinct.
// To do this, loop next node for first, loop next node for second, and loop large character they take from there
// -> Complexity O(n^2 * n^2)

mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
template<class T>
T rand(T a, T b) {
	return uniform_int_distribution<T>(a, b)(rng);
}
template<class T>
T rand() {
	return uniform_int_distribution<T>()(rng);
}

// Struct for priority queue operations on index set [0, n-1]
// push(i, v) overwrites value at position i if one already exists
// decKey is faster but requires that the new key is smaller than the old one
struct Prique {
	const ll INF = 4 * (ll)1e18;
	vector<pair<ll, int>> data;
	const int n;

	Prique(int siz) : n(siz), data(2*siz, {INF, -1}) { data[0] = {-INF, -1}; }
	bool empty() const { return data[1].second >= INF; }
	pair<ll, int> top() const { return data[1]; }

	void push(int i, ll v) {
		data[i+n] = {v, (v >= INF ? -1 : i)};
		for (i += n; i > 1; i >>= 1) data[i>>1] = min(data[i], data[i^1]);
	}
	void decKey(int i, ll v) {
		for (int j = i+n; data[j].first > v; j >>= 1) data[j] = {v, i};
	}
	pair<ll, int> pop() {
		auto res = data[1];
		push(res.second, INF);
		return res;
	}
};

const ull MOD = (ull)4e9 + 7;
const ull MULT = rand(2ull, MOD - 2);
const int INF = 1e9 + 7;
const int N = 50;
const int C = 26;
vector<pair<int, int>> big_in[N];
pair<int, ull> opt[N][N][2]; // Two distinct shortest paths using only small characters from a to b
int dp[N][N][4];
int nxt[N][C];
bool goal[N];

pair<int, ull> extend(pair<int, ull> cur, int c) {
	return {cur.first + 1, (cur.second * MULT + c) % MOD};
}

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(0);

	// "What is the maximum k, such that exists i < n - k, such that str[i, i + k) = str[n - k, n)
	// -> reverse string. Need to find suffix occurring after i, with maximum LCA with i
	
	int n, k, m;
	cin >> n >> k >> m;
	for (int i = 0; i < k; ++i) {
		int t;
		cin >> t;
		goal[t - 1] = 1;
	}
	for (int i = 0; i < n; ++i) {
		for (int c = 0; c < C; ++c) nxt[i][c] = -1;
	}
	for (int j = 0; j < m; ++j) {
		int a, b;
		char c;
		cin >> a >> c >> b;
		--a; --b;

		if ('a' <= c && c <= 'z') {
			nxt[a][c - 'a'] = b;
		} else {
			big_in[b].emplace_back(c - 'A', a);
		}
	}
	for (int s = 0; s < n; ++s) {
		for (int t = 0; t < n; ++t) {
			opt[s][t][0] = {INF, 0ull};
			opt[s][t][1] = {INF, 0ull};
		}
		opt[s][s][0] = {0, 0ull};
		
		vector<pair<int, int>> que = {{s, 0}};
		for (int ind = 0; ind < que.size(); ++ind) {
			int i = que[ind].first;
			auto cur = opt[s][i][que[ind].second];
			for (int c = 0; c < C; ++c) {
				int t = nxt[i][c];
				if (t == -1) continue;

				auto off = extend(cur, c);
				if (off.first < opt[s][t][0].first) {
					opt[s][t][0] = off;
					que.emplace_back(t, 0);
				} else if (off != opt[s][t][0] && off.first < opt[s][t][1].first) {
					opt[s][t][1] = off;
					que.emplace_back(t, 1);
				}
			}
		}
		// for (int t = 0; t < n; ++t) cerr << s << ' ' << t << ": " << opt[s][t][0].first << ' ' << opt[s][t][1].first << '\n';
	}

	Prique pq(4*n*n);
	for (int a = 0; a < n; ++a) {
		for (int b = a; b < n; ++b) {
			for (int j = 0; j < 4; ++j) dp[a][b][j] = INF;
			if (goal[a] && goal[b]) {
				dp[a][b][0] = 0;
				pq.decKey(a + n*b, 0);
			}
		}
	}
	while(pq.top().second != -1) {
		auto pr = pq.pop();
		int ind = pr.second;
		int a = ind % n;
		int b = (ind / n) % n;
		int s = ind / (n * n) % 2;
		int r = ind / (2 * n * n);
		int base = dp[a][b][s + 2*r];
		// cerr << a << ' ' << b << ' ' << s << ' ' << r << ": " << base << '\n';
	
		if (s == 0) {
			for (int x = 0; x < n; ++x) {
				if (opt[x][a][0].first >= INF) continue;
				for (int y = 0; y < n; ++y) {
					if (opt[y][b][0].first >= INF) continue;

					int off = base + opt[x][a][0].first + opt[y][b][0].first;
					int off2 = base + min(opt[x][a][0].first + opt[y][b][1].first, opt[x][a][1].first + opt[y][b][0].first);
					if (r == 1 || opt[x][a][0] != opt[y][b][0]) off2 = off;
					
					int pa = min(x, y);
					int pb = max(x, y);
					if (dp[pa][pb][1] > off) {
						dp[pa][pb][1] = off;
						pq.decKey(pa + n*pb + n*n, off);
					}
					if (dp[pa][pb][3] > off2) {
						dp[pa][pb][3] = off2;
						pq.decKey(pa + n*pb + 3*n*n, off2);
					}
				}
			}
		} else {
			for (auto pr : big_in[a]) {
				for (auto pr2 : big_in[b]) {
					if (pr.first != pr2.first) continue;

					int x = pr.second;
					int y = pr2.second;
					int pa = min(x, y);
					int pb = max(x, y);

					int off = base + 2;
					if (dp[pa][pb][2*r] > off) {
						dp[pa][pb][2*r] = off;
						pq.decKey(pa + n*pb + 2*r * n*n, off);
					}
				}
			}
		}
	}

	int res = min(dp[0][0][2], dp[0][0][3]);
	if (res < INF) {
		cout << res << '\n';
	} else {
		cout << -1 << '\n';
	}
	
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 2ms
memory: 3680kb

input:

4 1 8
3
1 F 1
1 A 2
2 b 1
2 F 3
2 d 3
3 B 3
3 y 4
4 d 1

output:

10

result:

ok single line: '10'

Test #2:

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

input:

4 1 8
3
1 F 1
1 A 2
2 b 1
2 F 3
2 d 3
3 B 3
3 y 4
4 d 4

output:

-1

result:

ok single line: '-1'

Test #3:

score: 0
Accepted
time: 2ms
memory: 3660kb

input:

5 2 5
1
5
1 i 2
2 c 3
3 p 4
4 c 1
1 I 5

output:

4

result:

ok single line: '4'

Test #4:

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

input:

8 2 96
4
8
1 x 2
1 y 5
2 A 3
3 A 4
4 A 2
5 A 6
6 A 7
7 A 8
8 A 5
5 B 2
6 B 2
7 B 2
8 B 2
5 C 2
6 C 2
7 C 2
8 C 2
5 D 2
6 D 2
7 D 2
8 D 2
5 E 2
6 E 2
7 E 2
8 E 2
5 F 2
6 F 2
7 F 2
8 F 2
5 G 2
6 G 2
7 G 2
8 G 2
5 H 2
6 H 2
7 H 2
8 H 2
5 I 2
6 I 2
7 I 2
8 I 2
5 J 2
6 J 2
7 J 2
8 J 2
5 K 2
6 K 2
7 K 2
8...

output:

24

result:

ok single line: '24'

Test #5:

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

input:

4 1 4
1
1 d 2
2 A 3
3 A 4
4 d 1

output:

-1

result:

ok single line: '-1'

Test #6:

score: 0
Accepted
time: 2ms
memory: 3596kb

input:

7 1 8
1
1 d 2
2 A 3
3 A 4
4 d 1
1 A 5
5 d 6
6 d 7
7 A 1

output:

8

result:

ok single line: '8'

Test #7:

score: 0
Accepted
time: 2ms
memory: 3616kb

input:

1 1 1
1
1 a 1

output:

1

result:

ok single line: '1'

Test #8:

score: 0
Accepted
time: 2ms
memory: 3712kb

input:

1 1 1
1
1 A 1

output:

-1

result:

ok single line: '-1'

Test #9:

score: 0
Accepted
time: 2ms
memory: 3644kb

input:

2 1 2
2
1 a 2
1 b 2

output:

2

result:

ok single line: '2'

Test #10:

score: 0
Accepted
time: 2ms
memory: 3700kb

input:

2 2 1
1
2
1 a 2

output:

1

result:

ok single line: '1'

Test #11:

score: 0
Accepted
time: 2ms
memory: 3732kb

input:

4 2 3
3
4
1 A 2
2 a 3
2 b 4

output:

4

result:

ok single line: '4'

Test #12:

score: 0
Accepted
time: 3ms
memory: 3740kb

input:

50 1 149
50
1 A 2
2 B 3
3 C 4
4 D 5
5 E 6
6 F 7
7 G 8
8 H 9
9 I 10
10 J 11
11 K 12
12 L 13
13 M 14
14 N 15
15 O 16
16 P 17
17 Q 18
18 R 19
19 S 20
20 T 21
21 U 22
22 V 23
23 W 24
24 X 25
25 Y 26
26 Z 27
27 A 28
28 B 29
29 C 30
30 D 31
31 E 32
32 F 33
33 G 34
34 H 35
35 I 36
36 J 37
37 K 38
38 L 39
3...

output:

288

result:

ok single line: '288'

Test #13:

score: 0
Accepted
time: 1ms
memory: 3632kb

input:

50 1 500
50
1 A 2
1 Z 2
1 Y 2
1 X 2
1 W 2
1 V 2
1 U 2
1 T 2
1 S 2
1 R 2
2 B 3
2 A 3
2 Z 3
2 Y 3
2 X 3
2 W 3
2 V 3
2 U 3
2 T 3
2 S 3
3 C 4
3 B 4
3 A 4
3 Z 4
3 Y 4
3 X 4
3 W 4
3 V 4
3 U 4
3 T 4
4 D 5
4 C 5
4 B 5
4 A 5
4 Z 5
4 Y 5
4 X 5
4 W 5
4 V 5
4 U 5
5 E 6
5 D 6
5 C 6
5 B 6
5 A 6
5 Z 6
5 Y 6
5 X 6
...

output:

533

result:

ok single line: '533'

Test #14:

score: 0
Accepted
time: 2ms
memory: 3832kb

input:

50 1 500
50
1 A 2
1 Z 2
1 Y 2
1 X 2
1 W 2
1 V 2
1 U 2
1 T 2
1 S 2
1 R 2
2 B 3
2 A 3
2 Z 3
2 Y 3
2 X 3
2 W 3
2 V 3
2 U 3
2 T 3
2 S 3
3 C 4
3 B 4
3 A 4
3 Z 4
3 Y 4
3 X 4
3 W 4
3 V 4
3 U 4
3 T 4
4 D 5
4 C 5
4 B 5
4 A 5
4 Z 5
4 Y 5
4 X 5
4 W 5
4 V 5
4 U 5
5 E 6
5 D 6
5 C 6
5 B 6
5 A 6
5 Z 6
5 Y 6
5 X 6
...

output:

-1

result:

ok single line: '-1'

Test #15:

score: 0
Accepted
time: 2ms
memory: 3768kb

input:

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

output:

1200

result:

ok single line: '1200'

Test #16:

score: 0
Accepted
time: 30ms
memory: 3800kb

input:

50 5 2600
12
10
36
19
9
1 A 6
1 B 12
1 C 2
1 D 35
1 E 12
1 F 50
1 G 46
1 H 13
1 I 30
1 J 24
1 K 39
1 L 21
1 M 23
1 N 46
1 O 41
1 P 5
1 Q 43
1 R 24
1 S 43
1 T 8
1 U 50
1 V 41
1 W 47
1 X 11
1 Y 4
1 Z 26
1 a 33
1 b 34
1 c 30
1 d 37
1 e 4
1 f 42
1 g 22
1 h 14
1 i 44
1 j 18
1 k 50
1 l 16
1 m 24
1 n 41
1 ...

output:

2

result:

ok single line: '2'

Test #17:

score: 0
Accepted
time: 2ms
memory: 3848kb

input:

50 20 2600
8
45
50
40
10
13
27
2
21
34
31
25
36
46
39
15
16
20
35
26
1 A 45
1 B 39
1 C 21
1 D 10
1 E 22
1 F 50
1 G 18
1 H 23
1 I 19
1 J 40
1 K 17
1 L 45
1 M 42
1 N 10
1 O 35
1 P 45
1 Q 7
1 R 6
1 S 19
1 T 40
1 U 21
1 V 39
1 W 17
1 X 30
1 Y 31
1 Z 26
1 a 18
1 b 49
1 c 18
1 d 18
1 e 29
1 f 18
1 g 49
1 ...

output:

-1

result:

ok single line: '-1'

Test #18:

score: 0
Accepted
time: 5ms
memory: 3708kb

input:

50 20 2600
8
45
50
40
10
13
27
2
21
34
31
25
36
46
39
15
16
20
35
26
1 A 45
1 B 39
1 C 21
1 D 10
1 E 22
1 F 50
1 G 18
1 H 23
1 I 19
1 J 40
1 K 17
1 L 45
1 M 42
1 N 10
1 O 35
1 P 45
1 Q 7
1 R 6
1 S 19
1 T 40
1 U 21
1 V 39
1 W 17
1 X 30
1 Y 31
1 Z 26
1 a 18
1 b 49
1 c 18
1 d 38
1 e 29
1 f 18
1 g 49
1 ...

output:

5

result:

ok single line: '5'

Test #19:

score: 0
Accepted
time: 2ms
memory: 3704kb

input:

9 2 15
6
3
1 A 2
1 f 3
2 c 4
2 H 6
2 b 5
3 G 1
4 H 4
4 e 7
4 D 1
5 d 8
5 L 3
7 F 9
8 F 9
9 H 6
9 p 1

output:

10

result:

ok single line: '10'

Test #20:

score: 0
Accepted
time: 3ms
memory: 3644kb

input:

7 3 62
5
6
7
1 A 2
2 a 5
2 b 3
2 c 4
3 a 4
3 b 4
3 c 4
3 d 4
3 e 4
3 f 4
3 g 4
3 h 4
3 i 4
3 j 4
3 k 4
3 l 4
3 m 4
3 n 4
3 o 4
3 p 4
3 q 4
3 r 4
3 s 4
3 t 4
3 u 4
3 v 4
3 w 4
3 x 4
3 y 4
3 z 4
4 a 3
4 b 3
4 c 3
4 d 3
4 e 3
4 f 3
4 g 3
4 h 3
4 i 3
4 j 3
4 k 3
4 l 3
4 m 3
4 n 3
4 o 3
4 p 3
4 q 3
4 r 3...

output:

-1

result:

ok single line: '-1'

Test #21:

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

input:

9 2 15
6
3
1 A 2
1 f 3
2 c 4
2 H 6
2 b 5
3 G 1
4 H 4
4 e 7
4 D 1
5 d 8
5 L 3
7 r 9
8 t 9
9 H 6
9 p 1

output:

7

result:

ok single line: '7'

Test #22:

score: 0
Accepted
time: 2ms
memory: 3828kb

input:

24 4 30
2
3
15
23
1 B 2
2 C 3
3 D 2
3 f 4
3 A 17
4 A 5
5 g 6
5 R 2
6 Z 7
6 N 5
7 b 8
8 g 9
9 r 10
10 h 11
10 S 10
11 T 12
12 r 13
13 K 14
14 m 15
15 L 16
16 G 1
17 x 18
18 f 19
19 Z 20
20 V 2
20 T 21
21 K 22
22 m 23
23 F 24
24 C 1

output:

23

result:

ok single line: '23'

Test #23:

score: 0
Accepted
time: 2ms
memory: 3636kb

input:

7 2 6
4
7
1 f 2
2 A 3
3 b 4
1 g 5
5 A 6
6 c 7

output:

6

result:

ok single line: '6'

Test #24:

score: 0
Accepted
time: 2ms
memory: 3692kb

input:

26 4 32
2
3
15
25
1 B 2
2 C 3
3 D 2
3 f 4
3 A 17
4 A 5
5 g 6
5 R 2
6 Z 7
6 N 5
7 b 8
8 g 9
9 r 10
10 h 11
10 S 10
11 T 12
12 r 13
13 K 14
14 m 15
15 L 16
16 G 1
17 x 18
18 f 19
19 Z 20
20 V 2
20 T 21
21 K 22
22 m 23
23 i 24
24 k 25
25 F 26
26 C 1

output:

25

result:

ok single line: '25'

Test #25:

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

input:

4 1 4
4
1 m 2
2 X 3
3 a 4
3 b 4

output:

6

result:

ok single line: '6'

Test #26:

score: 0
Accepted
time: 3ms
memory: 3748kb

input:

50 1 2600
1
1 A 35
1 B 18
1 C 24
1 D 43
1 E 9
1 F 50
1 G 5
1 H 9
1 I 6
1 J 6
1 K 26
1 L 37
1 M 48
1 N 29
1 O 18
1 P 21
1 Q 50
1 R 33
1 S 47
1 T 27
1 U 31
1 V 39
1 W 27
1 X 24
1 Y 44
1 Z 33
1 a 16
1 b 7
1 c 38
1 d 7
1 e 49
1 f 12
1 g 47
1 h 20
1 i 5
1 j 42
1 k 29
1 l 14
1 m 32
1 n 28
1 o 28
1 p 30
1 ...

output:

-1

result:

ok single line: '-1'