KMP算法:实现两个字符串的匹配。
KMP讲解
//KMP模板
#include<bits/stdc++.h>
using namespace std;
void get_next(string t, int* next){
int i=0;
int j=-1;
next[0]=-1;
while(i<t.length()){
if(j==-1||t[i]==t[j]){
i++,j++;
next[i]=j;
}
else{
j=next[j];
}
}
}
int kmp(string s, string t){
int next[t.length()+5];
get_next(t, next);
int i=0;
int j=0;
while(i<s.length()&&j<t.length()){
if(j==0||s[i]==t[j]){
i++,j++;
}
else{
j=next[j];
}
}
if(i==s.length()){
return -1;
}
if(j==t.length()){
return i-t.length()+1;
}
}
int main(){
string a, b;
a="abcde";
b="cd";
cout<<kmp(a, b);
return 0;
}
例一:子串
牛客题目链接
给出一个正整数n,我们把1…n在k进制下的表示连起来记为s(n,k),例如s(16,16)=123456789ABCDEF10, s(5,2)=11011100101。现在对于给定的n和字符串t,我们想知道是否存在一个k(2 ≤ k ≤ 16),使得t是s(n,k)的子串。
输入描述:
第一行一个整数n(1 ≤ n ≤ 50,000)。
第二行一个字符串t(长度 ≤ 1,000,000)
输出描述:
“yes"表示存在满足条件的k,否则输出"no”
示例1
输入
8
01112
输出
yes
这道题直接套KMP模板就行,没有太多拐弯抹角的东西。
#include<bits/stdc++.h>
using namespace std