KMP类似暴力,但是不会和暴力完全一样,回溯到起点。

简单的说  假如   模板链字符串是:        abcabcabcabd        寻找abcabd 在模板链出现的次数,并且输出该次数。

完全暴力过程:

假设  a【】为模板链,b【】为要查找的子序列。

先取b【】的首一直对应,然后a【】,b【】同时移动,当a【】,b【】不匹配的时候,b【】回到起点,a【】向后移动单位1。              这点很容易想到,我写出来是为了方便和后面的KMP算法作比较。

KMP过程:

假设仍然如上。

这个我们先要对b【】进行处理,假设做一个int的数组  next【】

b【】             a    b    c    a    b    d

next【】       -1    0    0    0    1     2

匹配过程:

a【】       a    b    c    a    b    c    a    b    d          >>>>>>>>>假设 在a中,查找b出现的次数,区间不交叉

简单说吧

前面和暴力相同

暴力得到结果为:a    b    c    a    b                   //此处还有d没匹配,下一步就是KMP的用处了

不同之处在于

a     b    c    a    b     d(d处不对应)

下一次匹配对应的是

a     b   c    a    b   d

(移动的位置跟next相同,d对应的next的值为2,所以b【】移动1+2的位置)

入门题:   hdu  2087        点击打开链接

Problem Description
一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案。对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出几块小饰条来呢?
 
Input
输入中含有一些数据,分别是成对出现的花布条和小饰条,其布条都是用可见ASCII字符表示的,可见的ASCII字符有多少个,布条的花纹也有多少种花样。花纹条和小饰条不会超过1000个字符长。如果遇见#字符,则不再进行工作。
 
Output
输出能从花纹布中剪出的最多小饰条个数,如果一块都没有,那就老老实实输出0,每个结果之间应换行。
 
Sample Input

abcde 
a3
 
 
aaaaaa 
aa
 
#
 
Sample Output

0
3

ac代码:

#include<cstdio>
#include<cstring>
char a[1010],b[1010];
int next[1010];
int lena,lenb;
void getnext()               //做的第一步是获得next【】的值
{
int i=0,k=-1;
next[0]=-1;
while (i<lenb)
{
if (k==-1||b[i]==b[k])
{
i++;
k++;
next[i]=k;
}
else k=next[k];
}
}
int KMP()
{
getnext();
int i=0,j=0,cnt=0;
while (i<lena)
{
if (j==-1||a[i]==b[j])
{
i++;j++;
}
else j=next[j];
if (j==lenb)
{
cnt++;
j=0;
}
}
return cnt;
}
int main()
{
while(scanf("%s",a)!=EOF)
{
if (*a=='#')
break;
scanf("%s",b);
lena=strlen(a);
lenb=strlen(b);
printf ("%d\n",KMP());
}
return 0;
}

最新文章

  1. ASP.NET Core应用针对静态文件请求的处理[5]: DefaultFilesMiddleware中间件如何显示默认页面
  2. bzoj1078【SCOI2008】斜堆
  3. 【ZJOI2013】k大数查询 BZOJ 3110
  4. 关于JAVA中对字符串与数组求长度的问题
  5. VC 使用OnCtlColor函数来改变控件颜色(引用)
  6. Linux常用命令学习1---(安装、文件系统、目录操作命令cd ls mv cp rm mkdir、链接命令ln……)
  7. PL/SQL Developer去掉启动时自动弹出的Logon弹出框方法
  8. java web页面 base
  9. POJ 1330 Nearest Common Ancestors(求最近的公共祖先)
  10. SqlBulkCopy高效能批量插入SQL SERVER
  11. C# 将数据集以excel的形式输出
  12. Embedded software develop step
  13. [CODEVS 1288]埃及分数
  14. BeanFactory not initialized or already closed - call &#39;refresh&#39; before accessing beans via the ApplicationContext
  15. OJ题:将一个字符串顺序翻转
  16. SQL Server(1)数据库基础
  17. Windows安装MongoDB 4.0并赋予用户访问权限
  18. C语言fprintf, fwrite, fscanf, fread混用问题
  19. idea 2018.1破解激活方法,有效期至2099年
  20. Linux基础知识之用户和用户组以及 Linux 权限管理

热门文章

  1. CentOS 7.3 下 Mysql(mariadb)的安装
  2. 团队合作之Scrum
  3. Android(java)学习笔记51:ScrollView用法
  4. luogu P3796【模板】AC自动机(加强版)
  5. POJ 3621 Sightseeing Cows 【01分数规划+spfa判正环】
  6. 深度优先搜索(深搜)——Deep First Search【例题:迷宫】
  7. .NET中Ajax跨越访问
  8. C# Pascal 命名规则
  9. PC Android IOS资料同步更新
  10. LeetCode10.正则表达式匹配 JavaScript