Chapter 4. 字符串 KMP算法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Chapter 4. 字符串 KMP算法相关的知识,希望对你有一定的参考价值。
Chapter 4. 字符串 KMP算法
Sylvia‘s I.
表问窝,在窝翻遍全网的博客后,窝已经处于混乱状态……
Sylvia‘s II.
窝是贴代码的小能手……
//前方高能请注意
//窝并不知道窝在说什么……
#include<cstdio> #include<iostream> #include<algorithm> #include<cmath> #include<cstring> using namespace std; #define debug(x) cerr<<#x<<‘=‘<<x<<endl #define MAXN1 1000006 #define MAXN2 1003 int Next[MAXN2];//next是c++11的保留字…… char target[MAXN1],pattern[MAXN2];//target主串(目标串),pattern模式串 int lenp,lent;//各字符串长度 void GetNext(char p[],int lenp){//计算Next跳转数组 int i,j=0;//j指向的是已经匹配的前缀 Next[0]=0;//初始化 Next[1]=0;//初始化…… for (int i=1;i<lenp;i++){ while (j&&p[i]!=p[j]) j=Next[j];//跟下面的函数怎么那么类似啊 if (p[i]==p[j]) j++; Next[i+1]=j; //得到这一位的前缀后缀最长公共长度, //放入下一位的Next数组 //为什么是下一位?嗯,先去了解一下Next数组吧 } } void kmp (char t[],int lent,char p[],int lenp){//进行匹配 int i,j=0;//i指向的是target,j指向的是pattern for (int i=0;i<lent;i++){ while (j&&t[i]!=p[j]) j=Next[j];//失配,跳转 if (t[i]==p[j]) j++;//某一字符匹配成功那么向后指一位 if (j==lenp){//如果完全匹配成功 printf("%d\\n",i-lenp+2);//输出位置1,2,3,4…… j=Next[j];//继续匹配 } } } int main () { scanf("%s",target); scanf("%s",pattern); lenp=strlen(pattern); lent=strlen(target); GetNext(pattern,lenp); kmp(target,lent,pattern,lenp); for (int i=1;i<=lenp;i++) printf("%d ",Next[i]);//输出数组Next,窝就是咸的…… return 0; }
嫌疑人x献身
东野圭吾
“你我都不可能摆脱时钟的束缚,彼此都已沦为社会这个时钟的齿轮。
一旦少了齿轮,时钟就会出乱子。
纵然自己渴望率性而为,周遭也不容许我们这样做。
这虽然同时也让我们得到了安定,但失去自由也是不争的事实。”
Sylvia
二零一七年五月二十一日
以上是关于Chapter 4. 字符串 KMP算法的主要内容,如果未能解决你的问题,请参考以下文章