一道模板题,用来入门KMP。
对next数组不理解导致WA了两次,next数组用来求模式串的匹配问题,不是用来求主串的,给搞混了。
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
string s, t;
int ne[N];
int main(){
cin >> s >> t;
int lens = s.size(), lent = t.size();
s = '1' + s;
t = '1' + t;
for(int i = 2, j = 0; i <= lens; i ++){
while(j && t[i] != t[j + 1]) j = ne[j];
if(t[i] == t[j + 1])
j ++;
ne[i] = j;
}
for(int i = 1, j = 0; i <= lens; i ++){
while(j && s[i] != t[j + 1])
j = ne[j];
if(s[i] == t[j + 1])
j ++;
if(j == lent){
cout << i - j + 1 << endl;
j = ne[j];
}
}
for(int i = 1; i <= lent - 1; i ++)
cout << ne[i] << ' ';
cout << ne[lent] << endl;
return 0;
}