#include<iostream>
#include<vector>
using namespace std;
const int N = 1e6 + 10;
int Next[N];
string s1, s2;
void get(string s) {
int j = 0, k = -1;
Next[0] = -1;
while(j < s.size()) {
if(k == -1 || s[j] == s[k]) {
++j;
k++;
Next[j] = k;
} else {
k = Next[k];
}
}
}
//kmp算法改进
void get2(string s){
int j = 0, k = -1;
Next[0] = -1;
while(j < s.size()){
if(k == -1 || s[j] == s[k]){
++j; ++k;
if(s[j] != s[k]){
Next[j] = k;
}else{
Next[j] = Next[k];
}
}else{
k = Next[k];
}
}
}
int main() {
cin >> s1 >> s2;
get(s2);
int i=0,j=0;
int len1 = s1.size(), len2 = s2.size();
while(i<len1) {
if(j==-1 || s1[i]==s2[j])
i++,j++;
else j=Next[j];
if(j==len2) {
cout << i-len2+1 << endl;
j=Next[j];
}
}
for(i = 1; i <= s2.size(); i++) {
cout << Next[i] << ' ';
}
cout << endl;
}
kmp板子
最新推荐文章于 2022-11-22 23:25:33 发布