第11和第13样例的运行时间是1.20s,这该怎么优化
#include<bits/stdc++.h>
using namespace std;
int nextval[1000010];
void getNextval(string s2){
int i = 0;
int j = -1;
nextval[0] = -1;
int len2 = s2.length();
while(i < len2){
if(j == -1 || s2[i] == s2[j]){
++i;++j;
nextval[i] = j;
}
else{
j = nextval[j];
}
}
}
int KMP(int &i, int &j, string s1, string s2){
int len1 = s1.length();
int len2 = s2.length();
while(i < len1 && j < len2){
if(j == -1 || s1[i] == s2[j]){
++i;++j;
}
else{
j = nextval[j];
}
}
if(j >= len2){
return i-j+1;
}
else{
return -1;
}
}
int main(){
string s1, s2;
cin>>s1;
cin>>s2;
int i = 0, j = 0;
getNextval(s2);
int len1 = s1.length();
int len2 = s2.length();
while(i < len1){
int temp = KMP(i, j, s1,s2);
if(temp != -1){
printf("%d\n", temp);
j = nextval[j];
}
else{
break;
}
}
for(int k = 1; k <= len2; k++){
printf("%d ", nextval[k]);
}
}