当前位置: 代码迷 >> 综合 >> lcp+dp Codeforces611D New Year and Ancient Prophecy
  详细解决方案

lcp+dp Codeforces611D New Year and Ancient Prophecy

热度:36   发布时间:2023-12-14 03:30:08.0

传送门:点击打开链接

题意:长为n的只有数字组成的字符串(n<=5000),问能分割成多少组数字,这些数字里不含前导0,且数字的大小满足严格单调递增

思路:最难的地方,就是如何去快速判断两个数字的大小谁大谁小呢?

我们先来讲下最长公共前缀lcp的定义。如果有串A和串B,lcp[i][j]表示的是串A从原串第i位置开始,串B从原串第j位置开始,那么从这两个位置开始的有多少个字符相等

那么如何来求lcp呢,方程很简单,看了都能懂

lcp[i][j]=lcp[i+1][j+1]+1,if(s[i]==s[j])

lcp[i][j]=0,if(s[i]!=s[j])


求出lcp后如何快速判断两个区间的大数字是否相等呢?

假如lcp[a][b]>=len ,说明两个区间的数字是完全相等的,此时肯定数字是相等的

如果lcp[a][b]<len,那么我们只需要比较s[a+lcp[a][b]]和s[b+lcp[a][b]]的大小就可以了,因为这个位置是两个子串第一个不一样的位置.

知道了这个的话,我们就能再来考虑这道题的dp了。


设dp[i][j](j<=i)表示现在只考虑前i个,最后一个数字是以第j个开头。

那么就能得到转移方程

dp[i][j]+=dp[j-1][k], max(j+1-len,1)

  相关解决方案