摘要: 题目链接:http://www.bnuoj.com/bnuoj/problem_show.php?pid=29355与Trie树相关的计数问题。因为正反各插了一次,所以字典中一共有2N个单词。val[i]存储了在该位置有相同字母的单词的个数,对于在该位置的每个字母,2N-val[i]代表与其不同的单词个数,所以对于每个单词的每个位置的字母,不同的需要删,相同的不需要删。对于在该位置的所有单词,一共删的次数即为val[i]*( 2*N - val[i] )。把每个位置都跑一边,最后的式子即为:ans += val[i]*( 2*N - val[i] )这个方法也是从别人的代码里学来的,我能力有限 阅读全文
posted @ 2013-05-03 23:29 冰鸮 阅读(299) 评论(0) 推荐(0)
摘要: 题目链接:http://www.bnuoj.com/bnuoj/problem_show.php?pid=29065Descripion《火影忍者》中,在忍者们使用忍术的时候,需要一定的查克拉(可以看成是一种体力值)。在战斗前,大家都希望提高自己的查克拉。鸣人发明了一种忍术,可以在短时间内提高查克拉。在使用忍术前,鸣人需要做一个仪式,这个仪式决定之后每个时刻的一个查克拉值。这些值的使用规则是:如果在某个时刻发动这个忍术,鸣人需要先消耗该时刻的查克拉值;在某个时候结束这个忍术,鸣人能获得该时刻的查克拉值(忍术必须先发动才能结束)。当然,如果某时刻鸣人具有的查克拉值少于该时刻的查克拉值,那么鸣人是 阅读全文
posted @ 2013-05-03 21:16 冰鸮 阅读(275) 评论(0) 推荐(0)
摘要: dp[m][i][j]代表第m组以字母(i +'a') 开头和以字母 ( j + 'a' )结尾的最小块数。kuai[m]中存储了第 m 组最少可以分为多少块,显然最少为所有相同字母放在一起时的块数,即这一组中不同字母的个数。如果前一组的结尾与后一组的开头相同,则dp[m][i][j] = min( dp[m-1][st][ed] + kuai[m] - 1 );若不同,则dp[m][i][j] = min(dp[m - 1][st][ed] + kuai[m] ); 1 #include <cstdio> 2 #include <cstrin 阅读全文
posted @ 2013-05-03 16:03 冰鸮 阅读(310) 评论(0) 推荐(0)