[POJ 2778]

DNA Sequence

trie图

题意是,输入m个禁忌字符串,和长度n,问只包含’A’、’C’、’G’和’T’4种字符的总长为n且不包含任一禁忌字符串的字符串总数是多少。

利用trie图建立的DFA,可以根据安全状态间的状态转移来得到总长为k的安全字符串总数。

例如,对于sample数据:

建好的trie图为:
593_0

其中安全结点为根结点0和接收到’A’之后的结点1。他们之间的状态转移为0->0(3重)、0->1,用矩阵表示就是:

用该矩阵与向量(1,1,1,1,1,1)相乘k次,即可得到从各个点出发长度为k的安全字符串总数。而题目本身n最多是2*10^9的,刚好适合用矩阵幂乘来O(l^2*log(n))地得到结果,这里l是结点总数,最多10个长度为10的禁忌字符串,因此DFA图中最多包含101个结点。

另外,这题应该是根据Censored!修改来的。后者与本题的区别仅在于字符数更多,不需要矩阵幂乘,但要用到高精度(其实还有OTL的unicode字符输入,阴了好多人)……