Petrozavodsk Winter 2020. Day 2. Greetings from Japan G - Ambiguous Encoding

URL

https://onlinejudge.u-aizu.ac.jp/problems/1406

题意

有一个大小为 \(n\) 的字符集。现在用一些互不相同的 \(01\) 串给这些字符编码,第 \(i\) 个字符对应的 \(01\) 串为 \(s_i\)。一个字符串的编码定义为每个字符的 \(01\) 编码顺次连接而成的到的 \(01\) 串。

求一个最短的 \(01\) 串,使得存在两个不同的字符串的编码都为这个串,输出这个串长度。如果不存在的话输出 \(0\)

\(n \le 1000, 1 \le |s_i| \le 16\)

解法一

考虑一个生成两个不同字符串的算法,记 \(dp_{i,d}\) 为编码较长的那个字符串的最后一个字符为 \(i\),两个串的编码长度差为 \(d\) 时较长的那个编码的最小长度,转移时可以保证 \(d \le 16\),可以直接跑最短路。

复杂度 \(O((16n^2) \log{16n^2})\)

解法二

直接把两个串对齐后跑 BFS 转移,复杂度不太会证啊。。。

实现

解法一:https://ideone.com/7Rb0ps

猜你喜欢

转载自www.cnblogs.com/iefnah06/p/12977074.html
今日推荐