`
cscoder
  • 浏览: 15922 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

NYOJ 5 Binary String Matching (kmp 字符串匹配)

 
阅读更多

Binary String Matching

时间限制:3000ms | 内存限制:65535KB
难度:3
描述
Given two strings A and B, whose alphabet consist only ‘0’ and ‘1’. Your task is only to tell how many times does A appear as a substring of B? For example, the text string B is ‘1001110110’ while the pattern string A is ‘11’, you should output 3, because the pattern A appeared at the posit
输入
The first line consist only one integer N, indicates N cases follows. In each case, there are two lines, the first line gives the string A, length (A) <= 10, and the second line gives the string B, length (B) <= 1000. And it is guaranteed that B is always longer than A.
输出
For each case, output a single line consist a single integer, tells how many times do B appears as a substring of A.
样例输入
3
11
1001110110
101
110010010010001
1010
110100010101011 
样例输出
3
0
3 
来源
网络
上传者
naonao

南阳oj上这道题太水了;直接用朴素算法暴力就水过了,数据量太少了,然后我们把题目移到我们自己的oj上,自己多出了一些数据,测试了一下,朴素算法用时3300ms,kmp用时1700ms左右,仅供参考,足以显示出kmp算法的优越性啊,最近两天也看了好久kmp,感觉有些细节的地方还是理解的不到位;还是要多回顾理解,看的是july大神的博客kmp算法讲的比较详细,多读几遍,大话数据结构上分析的也比较好;供自己以后复习回顾;
下面是朴素算法过的,暴力;
朴素算法关键在于回溯,处理好回溯;
  1. #include<cstdio>
  2. #include<cstring>
  3. intmain()
  4. {
  5. intn,count;
  6. chara[200],b[1200];
  7. scanf("%d",&n);
  8. getchar();
  9. while(n--)
  10. {
  11. count=0;
  12. inti=0,j=0,len;
  13. scanf("%s\n%s",a,b);
  14. len=strlen(b);
  15. while(i<=len)
  16. {
  17. if(a[j]=='\0')
  18. {
  19. count++;
  20. i=i-j+1;
  21. j=0;
  22. }
  23. elseif(a[j]==b[i])
  24. {
  25. i++;
  26. j++;
  27. }
  28. else
  29. {
  30. i=i-j+1;//关键在于回溯
  31. j=0;
  32. }
  33. }
  34. printf("%d\n",count);
  35. }
  36. return0;
  37. }
下面是kmp算法,还要多多加强,巩固理解;
朴素算法中的回溯很多是不必要的,所以就有了kmp算法,用一个next数组储存下一次要匹配的位置,这里难理解的就是next数组,其中还要理解后缀和前缀的关系,通过匹配字符串前后的联系,得出next数组;而就不需要移动主串的位置;节约了回溯的时间;
  1. #include<cstdio>
  2. #include<cstring>
  3. intnextval[200];
  4. voidget_next(chara[])//得到next数组;
  5. {
  6. intlen;
  7. inti=0,j=-1;
  8. nextval[0]=-1;
  9. len=strlen(a);
  10. while(i<=len)
  11. {
  12. if(j==-1||a[i]==a[j])
  13. {
  14. ++i;
  15. ++j;
  16. if(a[i]==a[j])
  17. nextval[i]=nextval[j];//把回溯的内容全换成是next数组;
  18. else
  19. nextval[i]=j;
  20. }
  21. else
  22. j=nextval[j];
  23. }
  24. }
  25. intkmp(chara[],charb[])//kmp的主体函数
  26. {
  27. inti=0,j=0,count=0;
  28. intlena,lenb;
  29. lena=strlen(a);
  30. lenb=strlen(b);
  31. get_next(a);
  32. while(i<=lenb)
  33. {
  34. if(j==-1||a[j]==b[i])
  35. {
  36. ++i;
  37. ++j;
  38. }
  39. else
  40. j=nextval[j];
  41. if(j>=lena)
  42. {
  43. count++;
  44. j=nextval[j];
  45. }
  46. }
  47. returncount;
  48. }
  49. intmain()
  50. {
  51. intn;
  52. chara[20],b[1200];
  53. scanf("%d",&n);
  54. while(n--)
  55. {
  56. scanf("%s\n%s",a,b);
  57. printf("%d\n",kmp(a,b));
  58. }
  59. return0;
  60. }
分享到:
评论

相关推荐

    ACM在线评测系统 NYOJ 题库 离线看题网页版 nyoj

    5. **排名系统**:基于用户的解题数量和速度,NYOJ通常会设立排行榜,激发学习者的竞争意识和团队合作精神。 6. **社区互动**:用户可以在平台上交流解题思路,讨论技术问题,分享编程经验,形成良好的学习氛围。 ...

    nyoj部分ACM答案

    ### nyoj部分ACM答案解析 #### 背景与目的 本篇文章旨在解析一个针对NYOJ(网络在线裁判系统)中ACM题目解答的示例代码。该代码使用了C++语言,并且主要涉及到了回溯算法的实现。对于初学者来说,通过深入理解这段...

    NYOJ.290.DictionaryTree.zip_trie树c_字典树_高级数据结构

    字典树,也被称为Trie树或前缀树,是一种高效的数据结构,尤其适用于字符串相关的查找和插入操作。在计算机科学领域,它被广泛应用在字典、搜索引擎、自动补全功能以及IP路由等方面。Trie树的核心优势在于其能够通过...

    NYOJ题目 离线版

    NYOJ(New York Online Judge)是一个在线编程竞赛平台,主要面向ACM(国际大学生程序设计竞赛)的参与者。这个离线版包含了NYOJ的所有题目,为编程爱好者和参赛者提供了一个方便的本地化练习环境。通过爬虫技术,...

    南阳理工学院OJ第1版解题报告V1.0.pdf

    字符串匹配问题,对于小规模数据集,可以直接暴力搜索。然而,当数据量增大时,高效的算法如KMP、Rabbin-Karp变得至关重要,这需要学生掌握更多高级搜索策略。 #### 6. 喷水装置(一) 贪心算法的应用案例,优先...

    ACM题库题库啊

    NYOJ,全称New York Online Judge,是一个在线编程竞赛平台,提供了丰富的ACM竞赛训练题目。离线版的NYOJ可能是将该平台的部分内容打包成CHM文件,方便用户在没有网络的情况下查阅和练习。这个CHM文件可能包含题目的...

    nyoj16.rar_site:www.pudn.com

    标题中的“nyoj16.rar”可能是指一个编程竞赛或者在线判题系统(如NOIP、NYOJ)的问题编号16的题目,而“site:www.pudn.com”通常用于搜索引擎查询,表明这个压缩文件可能来源于PUDN(普渡大学电子论坛)这个网站。...

    算法-矩形嵌套(NYOJ-16)(包含源程序).rar

    《算法-矩形嵌套(NYOJ-16)》是针对计算机科学中的一个典型问题进行探讨的资源包,其中包含了解决该问题的源程序。这个问题涉及到数据结构、图论以及算法设计等多个核心领域,是编程竞赛或算法学习中的常见题目。在...

    nyoj 61 传纸条(一)

    双线程动态规划问题,很值得练习。传一个ac代码,测试一下csdn的功能。

    nyoj_lvy实战开发系列《三》: 获取城市信息

    由于微信小程序没有方法可以获得当前用户所在城市的信息,所以需要调用方法来获取城市信息,用了两个方法去发送请求并返回城市信息  1. @Controller public class WechatLocationManager { private Logger logger ...

    nyoj_lvy实战开发系列《二》: 微信端开发:登录小程序

    这个小程序的主要目的是为了用户用微信的用户信息登录后将用户信息授权存入自己的数据库中,这样以后每次微信登录得到的code 所得到的 openid 可以在项目的数据库中查到该用户的相关信息。 在测试的过程中,需要用户...

    nyoj_lvy实战开发系列《一》:发送JSON信息,加密数据解密算法,UnionID机制说明

    前期小程序开发只进行到根据微信用户登录获取的code 去微信的API去获取到该用户的openId和session_key,到了第二阶段,老大让我重写OAuthManager的代码来实现微信小程序和微信公众号平台获取用户信息的优化,即将...

    南阳理工oj stl练习ac代码

    5. ACM竞赛: ACM(International Collegiate Programming Contest)是全球知名的大学生程序设计竞赛,其中STL的熟练运用是提高解题效率的关键。南阳理工的OJ平台可能包含ACM风格的题目,比如动态规划、图论、搜索...

    经典动态规划 南阳104最大和

    给定一个由整数组成二维矩阵(r*c),现在需要找出它的一个子矩阵,使得这个子矩阵内的所有元素之和最大,并把这个子矩阵称为最大子矩阵。

Global site tag (gtag.js) - Google Analytics