String(HDU 4821)
题意:给你串S,问有多少个不同的“recoverable”串
思路:通过题目我们发现“recoverable”串定义,格外重视串的子串两两不能完全相同!
因此,我们不妨枚举长度为L的子串,然后枚举个数为M个时,check一下此时是否符合要求
如何check?
利用map存储某个串的个数,那么如何存储某个串呢?
直接用哈希把串映射成整数存储
当我们枚举M个串时,需要检查cnt(枚举串的种类)是否等于M,如果等于,答案贡献+1,否则继续枚举

复杂度计算:枚举起点O(L),对于每一个起点,枚举的最坏复杂度为O(S / L),那么总复杂度为O(S)
AC代码

B - Little Tiger vs. Deep Monkey

题意:有n道单选题题目,每道单选题共两个选项,猴子与老虎每个人均需要作答这个n个题目。猴子答对每一道题目的概率为1/2,问老虎答对多少分才能使不输的概率为p?
思路:转化思维,老虎不输 == 猴子不赢
猴子得0分概率 + 猴子得1分概率 + … +猴子得i - 1分的概率 < p
猴子得0分概率 + 猴子得1分概率 + … +猴子得i分的概率 >= p

答案推出为i

那么如何计算猴子得分概率呢?

显然dp[i] += dp[i - a[j]](如果dp[i - a[j]]值更新没有用到a[j]时,这个式子就成立(因为每一个数最多用一次))

那我们就想到可以枚举物品,这样枚举时就能保证前面更新的dp值,不可能使用过当前物品,那么问题就可以轻松解决。
而且还需要注意一个点,就是枚举得分时要从大到小枚举,因为这样也是避免多次使用同一个物体的方法。你可以这样想,如果从小到大枚举,那么假如dp[v] += dp[v - a[i]],dp[q] = dp[q] + dp[q - a[i]] = dp[q] + dp[v](q - a[i] = v)你会发现更新dp[q]时,会用到两次a[i],显然错误!因此,我们需要从大到小更新。

AC代码