问题是N(1 <= N <= 10)字符串,长度不超过6,如何计算长度为L的字符串数(1 <= L <= 1000000) n字符串作为子字符串。 每个字符串只包含大写字母。
我能想到的最好的是使用dp L *(26 ^ 5),但我不认为这会超过时间限制:(任何人都可以分享一些想法吗?顺便说一下这是原始问题http://www.spoj.com/problems/GEN/如果你不明白我上面写的是什么
答案 0 :(得分:2)
首先,创建一个接受所有“坏”字符串的NFA(非确定性有限自动机)。然后使用子集构造将其转换为DFA。然后计算该DFA的补充。
计算DFA接受的字符串数量非常简单;在给定状态下结束的长度为k + 1的字符串数可以通过对在每个前任状态中结束的长度为k的字符串数进行求和来计算。
如果你有一个不错的实现,这可能会及时运行。但是,如果没有,您可以使用Aho-Corasick预处理的自动机而不是DFA。