70 ,倒数第一个和倒数第三个测试点TLE求助
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define N 200010
#define fi first
#define se second
#define INF 1e9
#define next nxt
ll next[N],ans;
vector<ll> v;
inline string read()
{
string str;
char s = getchar();
while (s == ' ' || s == '\n' || s == '\r')
{
s = getchar();
}
while (s != ' ' && s != '\n' && s != '\r')
{
str += s;
s = getchar();
}
return str;
}
void cal_next(string s,ll len){
next[0]=-1;
ll k=-1;
for(ll i=1;i<=len-1;i++){
while(k>-1&&s[k+1]!=s[i]){
k=next[k];
}
if(s[k+1]==s[i]) k++;
next[i]=k;
}
}
void kmp(string s1,ll s1len,string s2,ll s2len){
memset(next,-1,sizeof next);
cal_next(s2,s2.size());
ll k=-1;
for(ll i=0;i<s1len;i++){
while(k>-1&&s2[k+1]!=s1[i]){
k=next[k];
}
if(s2[k+1]==s1[i]){
k++;
}
if(k==s2len-1){
v.push_back(i-s2len+1);
k=-1;
i=i-s2len+1;;
}
}
}
void solve(){
string s1,s2;
s1=read();
s2=read();
kmp(s1,s1.size(),s2,s2.size());
for(auto i:v){
printf("%lld\n",i+1);
}
for(ll i=0;i<s2.size();i++){
printf("%lld ",next[i]+1);
//cout<<next[i]+1<<' ';
}
cout<<'\n';
}
int main(){
int T=1;
//ios::sync_with_stdio(false);
//cin.tie(0),cout.tie(0);
//cin>>T;
while(T--){
solve();
}
return 0;
}