参考连接:

KMP+DP:

http://www.cnblogs.com/yuelingzhi/archive/2011/08/03/2126346.html

另外给出一个没用dp做的:
http://blog.sina.com.cn/s/blog_82061db90100usxw.html

题意:

  给出一个字符串,求它的各个前缀在字符串中出现的次数总和。

思路:
记 dp[i] 为前 i 个字符组成的前缀出现的次数
则 dp[next[i]]+=dp[i]

dp[i]表示长度为i的前缀出现的次数,初始条件dp[i]=1,即至少出现一次。
举例:
index:012345
         ababa
next: 000123
dp[5]=1;
dp[4]=1;
i=5:dp[3]=dp[3]+dp[5]=2;
i=4:dp[2]=dp[2]+dp[4]=2;
i=3:dp[1]=dp[1]+dp[3]=3;
即各前缀出现次数:
a:3
ab:2
aba:2
abab:1
ababa:1

至于如何理解状态方程dp[next[i]]+=dp[i],看下面那张图:

设前缀s长度为i,在字符串中出现的次数为3次,即为图中的s1,s2,s3。
图中红色部分即为前缀与后缀相同的子串,长度为next[i]。
设为p1,p2,p3,p4(其中p2,p3各为两次重叠)
可以知道,p1即为一开始初始化时算入进去的1,而p2,p3,p4正好对应s1,s2,s3,即s在字符串中出现的个数dp[i]。
这样状态转移方程就好理解了。
dp[next[i]]=dp[next[i]]+dp[i]。

#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <string>
#include <string.h> using namespace std;
const int maxn=;
const int mod=;
int n;
char str[maxn];
int next[maxn];
int dp[maxn]; //dp[i]表示长度为i的前缀出现的次数
int len,L,l,num;
void getNext(char*str){
int k=,lm=strlen(str);
next[]=;
for(int i=;i<lm;i++){
while(k> && str[k]!=str[i])
k=next[k];
if(str[k]==str[i])
k++;
next[i+]=k;
}
}
int main()
{
int t;
char tmp[maxn];
scanf("%d",&t);
while(t--){
scanf("%d",&len);
scanf("%s",str);
getNext(str);
for(int i=;i<=len;i++)
dp[i]=; //初始均为1
for(int i=len;i>=;i--){
dp[next[i]]=(dp[next[i]]+dp[i])%mod;
}
int ans=;
for(int i=;i<=len;i++)
ans=(ans+dp[i])%mod; printf("%d\n",ans);
}
return ;
}

最新文章

  1. [转载] ORMs under the hood
  2. 位运算取第一个非0的位 r &amp; (~(r-1))
  3. 老男孩linux高级架构 百度云盘下载
  4. delete错误
  5. Mac Maven java_home错误
  6. SCAU 10678 神奇的异或
  7. asp.net获取select值的方法
  8. CentOS 6.5升级Python后yum不可用的解决方案
  9. Chapter 5 Blood Type——17
  10. ABAP 7.53 中的ABAP SQL(原Open SQL)新特性
  11. Lua 用指定字符或字符串分割输入字符串,返回包含分割结果的数组
  12. nvidia-docker2配置与NVIDIA驱动安装
  13. Redis密码设置与访问限制
  14. ABP .NET corej 版本 第一篇
  15. 3-Python3 环境搭建
  16. Eclipse下Maven新建项目、自动打依赖jar包(包含普通项目和Web项目)
  17. LeetCode-394. Decode String(DFS)
  18. cordova-ios 升级到4.4.0 无法真机跑iOS8 报错: dyld`dyld_fatal_error: -&gt; 0x120085088 &lt;+0&gt;: brk #0x3
  19. WPF成长之路------帧动画(1)
  20. 利用Json_encode解决中文问题

热门文章

  1. Ruby Code Style
  2. About Inside the Azure Storage Outage of November 18th
  3. 博客导出工具(C++实现,支持sina,csdn,自定义列表)
  4. shelll函数求两个输入数字之和
  5. 使用工厂bean和Utility Schema定义集合
  6. Windows下使用Visual Studio Code搭建Go语言环境
  7. sql总结
  8. 【ConnerStone】SVN代码管理 - 基本使用
  9. c语言参数类型
  10. 轻松解决在一个虚拟主机上运行多个 ASP.NET 网站应用