Description
给你一条由小写字母组成的长字符串$S$(长度不超过$300000$),再给你$N$($1\leq N\leq4000$)条短字符串$C_i$(每条长度不超过$100$),用$C_i$组成$S$,问有多少种方法,结果对$20071027$取模。
如:$S$为$abcd$,$C_i$分别为:$a,b,ab,cd$时。那么有$a+b+cd$和$ab+cd$两种方法。
多组测试数据。
Input
每组测试数据:
第一行:一个字符串,$S$ 。
第二行:一个整数,$N$ 。
接下来$N$行:每行一字条符串$C_i$ 。
Output
若干行:
每行格式为:”$Case$ $i$$:$ $ans$”(不含引号)。
Solution
看到方案数就可以想到用$DP$,这题有点像背包问题,用$F_i$表示:从$S_0$到$S_i$有多少种组合方法。则:
$Fi$=sum{$F{ i-len(C_j) }$|$Cj=F{ i-lenC_J…i }$}
显然每次求都搜索一遍$C_i$匹配一遍会超时时了。
这就要用到$trie$了。
把$C$全部组织成一棵$trie$,枚举$S$的起始点$i$,在$trie$上从$S_i$开始匹配,若匹配到$S_j$时可以匹配到一个完整的$Ck$就可以用$F{j-len(C_k)}$更新$F_j$了。
因为$len(C_i)$不超过$100$,所以在$trie$上匹配的次数不超过$100$,不会超时。
Code
|
|