HDU 3336 Count the string (KMP+DP)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3336
题目大意:给出一串字符串s,求出所有s的前缀在s中出现次数之和。
解题思路:
利用cnt[i]记录子串0~i共含有以b[i]为结尾的前缀的数目,得到状态转移方程:cnt[i]=cnt[next[i]]+1。
大概说一下我的理解吧,为什么是cnt[i]是表示以b[i]为结尾的前缀数量,因为从0~m递推过来b[i]作为在b[i-1]
后新出现的字符,cnt[i]记录的就是因b[i]出现后产生的前缀数量(跟b[i]的出现有关联的),首先肯定会包含的前缀就是0~i,还有0~next[i],那么
就是cnt[i]=cnt[next[i]]+1。
代码
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cstring> 5 using namespace std; 6 const int N=1e6+5; 7 const int MOD=10007; 8 9 int m; 10 int nxt[N],cnt[N]; 11 char p[N]; 12 13 void getnext(){ 14 int i,j; 15 i=0,j=nxt[0]=-1; 16 while(i<m){ 17 while(j!=-1&&p[i]!=p[j]) 18 j=nxt[j]; 19 nxt[++i]=++j; 20 } 21 } 22 23 int main(){ 24 int t; 25 scanf("%d",&t); 26 while(t--){ 27 scanf("%d%s",&m,p); 28 getnext(); 29 cnt[0]=0; 30 int sum=0; 31 //cnt[i]=cnt[next[i]]+1; 32 for(int i=1;i<=m;i++){ 33 cnt[i]=cnt[nxt[i]]+1; 34 sum=(sum+cnt[i])%MOD; 35 } 36 printf("%d\n",sum); 37 } 38 return 0; 39 }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core GC计划阶段(plan_phase)底层原理浅谈
· .NET开发智能桌面机器人:用.NET IoT库编写驱动控制两个屏幕
· 用纯.NET开发并制作一个智能桌面机器人:从.NET IoT入门开始
· 一个超经典 WinForm,WPF 卡死问题的终极反思
· ASP.NET Core - 日志记录系统(二)
· 博客园 & 1Panel 联合终身会员上线
· 支付宝事故这事儿,凭什么又是程序员背锅?有没有可能是这样的...
· https证书一键自动续期,帮你解放90天限制
· 告别虚拟机!WSL2安装配置教程!!!
· 在线客服系统 QPS 突破 240/秒,连接数突破 4000,日请求数接近1000万次,.NET 多