读研以后好久没有研究算法竞赛的题目了。这段时间算法课,刚好作业是要讲算法,就选了一道题目研究了一下,感觉还是蛮有意思的。但是说实话本弱鸡太菜了,靠自己肯定解决不了这么难的题,就参考了别人的代码啦(这个也找了半天,有好多人的实现都没看懂)。而且这个过程也接触到了以前没有接触过的构图技巧,叫什么前后缀优化建图,还是很有意义的。
题目链接(里面B题):
https://codeforces.com/gym/101190
题意:
给定n个0/1串,每个串至多有一个问号。问你是否能够找到方案,使得这些问号用0/1填充后,各个串之间互不为前缀。如果是,输出YES,并输出方案。否则,输出NO。
代码主要参考:
https://blog.csdn.net/kzn2683331518/article/details/101431239
主要思路:
互不为前缀,出现前缀这种字眼,可以联想到字典树。
对于问号的处理,用0替代插入字典树,用1替代插入至字典树中。
然后呢,替代字符串要么取0要么取1,对应于命题True/False,同时还有限制条件,即一个树的分支上最多只能有一个替代字符串,对分支上任意两个串a、串b,有条件(not a) or (not b),这样看就转换成了2-sat问题。