TLE求助
查看原帖
TLE求助
581319
TheCommonKiller楼主2022/8/2 16:02

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;
}
2022/8/2 16:02
加载中...