·· / ·– ·· ·-·· ·-·· / ·–· · ·-· ··· ·· ··· - / ··- -· - ·· ·-·· / ·· / ·– ·· -·
这题是刘汝佳老师《算法竞赛入门经典-训练指南》上字符串一节的例题,下文的思路直接来自书上的解析,代码来自代码仓库(需翻墙)
可以想到这样的递推法:令d(i)表示从字符i开始的字符串(即后缀S[i..L])的分解方案数,则d(i)=sum{d(i+len(x))|x为一个单词并且是S[i..L]的一个前缀}。
如果直接枚举x并判断其是否为S[i..L]的前缀会超时,这时可以构建一颗Trie树,并插入所有单词,然后在Trie树中「查找」S[i..L],经过一个单词结点,就能找到一个上述状态转移方程的x,因为每个单词长度最长为100,所以查找次数最多300000 * 100不会超时。
1 |
|