题目链接:http://icpc.njust.edu.cn/Problem/Hdu/3336/

题意就是要求一个字符串的所有前缀在字符串中出现的次数之和,我们容易想到kmp中的next数组,next[i]=j,表示存在一个长度为j的前缀与长度为j的后缀相同,本题的结果就是要对每一位的next数组都向前回退,回退的次数就是长度不同的前缀出现的次数。还可以采用dp的策略。

代码如下:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef unsigned int ui;
  4. typedef long long ll;
  5. typedef unsigned long long ull;
  6. #define pf printf
  7. #define mem(a,b) memset(a,b,sizeof(a))
  8. #define prime1 1e9+7
  9. #define prime2 1e9+9
  10. #define pi 3.14159265
  11. #define lson l,mid,rt<<1
  12. #define rson mid+1,r,rt<<1|1
  13. #define scand(x) scanf("%llf",&x)
  14. #define f(i,a,b) for(int i=a;i<=b;i++)
  15. #define scan(a) scanf("%d",&a)
  16. #define dbg(args) cout<<#args<<":"<<args<<endl;
  17. #define inf 0x3f3f3f3f
  18. #define maxn 1000010
  19. int n,m,t;
  20. int nxt[maxn];
  21. char s[maxn];
  22. void getnxt()
  23. {
  24. int i=-,j=;
  25. nxt[]=-;
  26. while(j<n)
  27. {
  28. if(i==-||s[i]==s[j])
  29. {
  30. i++,j++;
  31. nxt[j]=i;//不能用kmp优化的nxt,那样会损失数量
  32. }
  33. else i=nxt[i];
  34. }
  35. }
  36. int main()
  37. {
  38. //freopen("input.txt","r",stdin);
  39. //freopen("output.txt","w",stdout);
  40. std::ios::sync_with_stdio(false);
  41. scan(t);
  42. while(t--)
  43. {
  44. scan(n);
  45. scanf("%s",s);
  46. getnxt();
  47. int ans=;
  48. f(i,,n)//查看以i-1为截至位置的公共前缀后缀
  49. {
  50. int j=i;
  51. while(j>)
  52. {
  53. ans++;//初始时本身还要算一次
  54. if(ans>)ans-=;
  55. j=nxt[j];
  56. }
  57. }
  58. pf("%d\n",ans);
  59. }
  60. }

dp:

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <iostream>
  4. #include <time.h>
  5. #include <cstdlib>
  6. #include <cmath>
  7. #include <algorithm>
  8. using namespace std;
  9. int const MOD = ;
  10. int const MAXN = ;
  11. char s[MAXN];
  12. int next[MAXN],dp[MAXN];
  13. inline void Get_Next(int n){
  14. memset(next,,sizeof(next));
  15. for(int i = ;i < n;i++){
  16. int j = next[i];
  17. while(j && s[i] != s[j]) j = next[j];
  18. if(s[i] == s[j]) next[i + ] = j + ;
  19. else next[i + ] = ;
  20. }
  21. }
  22. int main(){
  23. int T;
  24. while(~scanf("%d",&T)){
  25. while(T--){
  26. int n;
  27. scanf("%d",&n);
  28. scanf("%s",s);
  29. Get_Next(n);
  30. for(int i = ;i < n;i++){
  31. dp[i] = ;
  32. }
  33. dp[] = ;
  34. int sum = ;
  35. for(int i = ;i <= n;i++){
  36. dp[i] = dp[next[i]] + ;
  37. sum = (sum + dp[i]) % MOD;
  38. }
  39. printf("%d\n",sum);
  40. }
  41. }
  42. return ;
  43. }

hdu3336 Counting the string kmp的next数组的应用的更多相关文章

  1. HDU3336 Count the string —— KMP next数组

    题目链接:https://vjudge.net/problem/HDU-3336 Count the string Time Limit: 2000/1000 MS (Java/Others)     ...

  2. hdu3336 Count the string kmp+dp

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3336 很容易想到用kmp 这里是next数组的应用 定义dp[i]表示以s[i]结尾的前缀的总数 那么 ...

  3. HDU3336 Count the string KMP 动态规划

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - HDU3336 题意概括 给T组数据,每组数据给一个长度为n的字符串s.求字符串每个前缀出现的次数和,结果mo ...

  4. HDU3336 Count the string(kmp

    It is well known that AekdyCoin is good at string problems as well as number theory problems. When g ...

  5. kuangbin专题十六 KMP&&扩展KMP HDU3336 Count the string

    It is well known that AekdyCoin is good at string problems as well as number theory problems. When g ...

  6. [KMP][HDU3336][Count the string]

    题意 计算所有S的前缀在S中出现了几次 思路 跟前缀有关的题目可以多多考虑KMP的NEXT数组 #include <cstdio> #include <cstring> #in ...

  7. Count the string[KMP]HDU3336

    题库链接http://acm.hdu.edu.cn/showproblem.php?pid=3336 这道题是KMP的next数组的一个简单使用,首先要理解next数组的现实意义:next[i]表示模 ...

  8. 求最长公共前缀和后缀—基于KMP的next数组

    KMP算法最主要的就是计算next[]算法,但是我们知道next[]求的是当前字符串之前的子字符串的最大前后缀数,但是有的时候我们需要比较字符串中前后缀最大数,比如 LeetCode的shortest ...

  9. KMP(next数组的更新理解)Codeforces Round #578 (Div. 2)--Compress Words

    题目链接:https://codeforc.es/contest/1200/problem/E 题意: 有n串字符串,让你连起来:sample please ease in out   ---> ...

随机推荐

  1. 对RLC重排序窗口大小的一点讨论

    在LTE协议栈的PDCP层和RLC层,都有一个重排序窗口(reordering window),主要用来保证数据的可靠传输,PDCP层的重排序窗口主要用于handover时保证数据的可靠传输,这里暂且 ...

  2. mac电脑终端使用scp上传/下载文件/文件夹

    1.从服务器下载文件到本地电脑 1 scp -r remote_username@remote_ip:remote_folder local_folder 例如: 1 scp -r root@106. ...

  3. APP倒闭:你充值的钱会蒸发吗?

    有一句说到吐,但却又不得不说的话:资本大潮退去,才知道谁在裸泳.随着资本寒冬的来临,互联网上众多看起来狂飙突进的项目却呈现迅速萎靡态势.尤其是众多具有互联网元素的油卡.洗衣.保洁等成为重灾区,其中不少 ...

  4. Flutter Widgets 之 RichText

    注意:无特殊说明,Flutter版本及Dart版本如下: Flutter版本: 1.12.13+hotfix.5 Dart版本: 2.7.0 基础用法 应用程序离不开文字的展示,因此文字的排版非常重要 ...

  5. 【视频+图文】带你快速掌握Java中含break语句的双重for循环

    双重for循环掌握后,我们就一起来看看双重for循环的进阶内容一之带break语句的双重for循环. 双重for循环[视频+图文]讲解传输门:点击这里可去小乔的哔哩哔哩观看~ 带continue语句的 ...

  6. java反序列化-ysoserial-调试分析总结篇(6)

    前言: 这篇记录CommonsCollections6的调试,外层也是新的类,换成了hashset,即从hashset触发其readObject(),yso给的调用链如下图所示 利用链分析: 首先在h ...

  7. Mac使用brew安装MongoDB

    之前一直使用以下命令安装MongoDB,但是一直安装不上 brew install mongodb 后来看了官网,安装方法如下 brew tap mongodb/brew //这步不知道需不需要 br ...

  8. 1024程序员节最新福利之2018最全H5前端资料集

    前言 有好久没有写博客了,主要这段时间都沉迷学习无法自拔了,哈哈.自吹一波. 前两天不是1024节吗,所以就有很多福利出现了,当然每个人能都获得的信息都有所不同,这就是所谓的信息差.秉着好东西需要分享 ...

  9. fsLayuiPlugin数据字典使用

    概述 数据字典主要解决下拉框数据填充和数据表格转义处理,一个数据字典可以多处使用. 1.多个页面下拉框使用同样的数据,改一个地方需要把所有页面都要修改 2.数据表格转义代替自己手动写templet解析 ...

  10. CSS+JS相应式导航菜单

    响应式导航菜单 响应式导航菜单就是当网页在其他不同视口的样式,不同的设备需要不同的样式 需要掌握的知识 - 掌握媒体查询,如果你不是很懂那就看我写的CSS响应式布局 掌握CSS重的display:no ...