<html>
Description
求子串的next值,用next数组存放。所有输出
Input
输入一个字符串
Output
输出全部next值
Sample Input
abaabcac
Sample Output
0 1 1 2 2 3 1 2
#include <iostream> #include <cstring> using namespace std; int main(){ char s[100]; cin>>s; int suffix[100]; int len=strlen(s); int pos=0; suffix[0]=-1; suffix[1]=0; for(int i=2;i<=len;++i){ while(pos>=0&&s[pos]!=s[i-1]) pos=suffix[pos]; suffix[i]=++pos; } int i=1; cout<<suffix[0]+1; while(i<strlen(s)){ cout<<' '<<suffix[i]+1; i++; } return 0; }
Description
输入一个主串和一个子串,用KMP进行匹配,问进行几趟匹配才成功,若没成功,则输出0
Input
输入一个主串和一个子串
Output
匹配的趟数
Sample Input
ababcabcacbab abcac
Sample Output
#include <iostream> #include <cstring> using namespace std; int main(){ char s[100]; char b[100]; cin>>b; cin>>s; int suffix[100]; int len=strlen(s); int pos=0; suffix[0]=-1; suffix[1]=0; for(int i=2;i<=len;++i){ while(pos>=0&&s[pos]!=s[i-1]) pos=suffix[pos]; suffix[i]=++pos; } int i=0,j=0; int cns=1; bool flag=false; while(i<strlen(b)) if(b[i]==s[j]){ j++; i++; if(s[j]=='\0'){ flag=true; break; } } else if(suffix[j]==-1){ i++; j=0; cns++; } else { j=suffix[j]; cns++; } if(flag)cout<<cns<<'\12'; else cout<<0<<'\12'; return 0; }
Description
输入一个主串和一个子串,若匹配成功,则找出匹配的趟数和在子串在主串中的位置,若匹配不成功,则输出0
Input
输入两个字符串
Output
输出匹配的趟数和位置
Sample Input
ababcabcacbab abcac
Sample Output
3 6
#include <iostream> #include <cstring> using namespace std; int main(){ char s[100]; char b[100]; cin>>b; cin>>s; int suffix[100]; int len=strlen(s); int pos=0; suffix[0]=-1; suffix[1]=0; for(int i=2;i<=len;++i){ while(pos>=0&&s[pos]!=s[i-1]) pos=suffix[pos]; suffix[i]=++pos; } int i=0,j=0; int cns=1; bool flag=false; while(i<strlen(b)) if(b[i]==s[j]){ j++; i++; if(s[j]=='\0'){ flag=true; break; } } else if(suffix[j]==-1){ i++; j=0; cns++; } else { j=suffix[j]; cns++; } //cout<<"i "<<i<<" j "<<j<<" len "<<strlen(b)<<'\12'; if(flag)cout<<cns<<' '<<i-j+1<<'\12'; else cout<<0<<'\12'; return 0; }
版权声明:本文为博主原创文章。未经博主同意不得转载。
举报
- 本文已收录于下面专栏:
相关文章推荐
-
KMP算法复习及练习
#include #include #include const int N=100; using namespace std; int main() { char a[N],b[N];...- tianfeng98
- 2016-11-16 23:35
- 46
-
KMP字符串模式匹配具体解释
KMP字符串模式匹配具体解释 <p class="Ms- feiliboos
- 2009-11-01 22:27
- 69
-
【练习03】 KMP 1004 Period
kmp,依次求字符串前缀的最小循环节, AC耗时500ms,可是在statistic里看到有人50msAC, 可能原因: 1.输入输出的优化 2.用了更奇妙的算法。//模板開始 #inclu...
- liuzhushiqiang
- 2013-06-21 16:28
- 356
-
kmp算法
串行串匹配算法 KMP算法 KMP算法的关键是依据给定的模式串W[1,m],定义一个next函数。next函数包括了模式串本身局部匹配的信息。next函数的定义例如以下: KMP算法的基本思想是:如果在模式匹配的进程中。运行T[i]和W[j]的匹配检查。若T[i]=W[j],则继续检查T[i+1]和 W[j+1]是否匹配。若T[i]<>W[j],则分成两种情况:若j=1,则模式串右移一位,检查T[i+1]和W[1]是否匹配;若1& lt;j<=m。则模式串右移
- famoushz
- 2010-01-20 17:27
- 912
-
【练习03】 KMP 1001 Number Sequence
非常纯正的KMP。模板函数仅仅需做非常小的修改。仅仅是把char *P, char *T换成int* P和int* T。//模板開始 #include #include #include ...- liuzhushiqiang
- 2013-05-17 16:48
- 455
-
KMP字符串模式匹配具体解释
个人认为这篇文章是网上的介绍有关KMP算法更让人easy理解的文章了,确实说得非常“具体”,耐心地把它看完肯定会有 所收获的~~,另外有关模式函数值next[i]确实有非常多版本号啊。在另外一些面向对象的算法描写叙述书中也有失效函数 f(j)的说法,事实上是一个意思。即next[j]=f(j-1)+1,只是还是next[j]这样的表示法好理解啊: KMP<span style="font-s- hulianwang2014
- 2008-11-11 23:33
- 23
-
POJ 3461 Oulipo KMP练习
题目链接 题目非常长,事实上就是字符串匹配。 所以,权当练习 KMP #include #include #define MB 10101 #define MA 1000100 char a[MA],...- kzzhr
- 2014-03-31 09:34
- 575
-
KMP字符串模式匹配具体解释
KMP字符串模式匹配通俗点说就是一种在一个字符串中定位还有一个串的高效算法。简单匹配算法的时间复杂度为O(m*n);KMP匹配算法。能够证明它的时间复杂度为O(m+n).。 一.简单匹配算法 先来看一个简单匹配算法的函数: int Index_BF ( char S [ ],
- BlogDown
- 2012-11-18 10:47
- 206
-
【练习03】 KMP 1006 Count the string
假设枚举全部前缀而且调用find函数会超时,可是我们思考一下就能发现仅仅要遍历数组f,当f的值非0,count就加1(包含f[n]),最后加上字符串长度n就是终于的结果。(细致理解) 最后还要注意的是...
- liuzhushiqiang
- 2013-06-21 21:00
- 437
-
[练习]erlang算法练习--KMP
生活有点无聊,就用erlang写写一些算法吧.闲着也闲着 首先是KMP 介绍: http://zh.wikipedia.org/wiki/%E5%85%8B%E5%8A%AA%E6%96%AF-%E8%8E%AB%E9%87%8C%E6%96%AF-%E6%99%AE%E6%8B%89%E7%89%B9%E7%AE%97%E6%B3%95</di- fair_jm
- 2013-07-30 17:57
- 651
收藏助手
不良信息举报
0条评论