警示后人-如果你 TLE #1
查看原帖
警示后人-如果你 TLE #1
809765
Limitless_lmw楼主2024/5/28 17:24

用快读

这是一份 TLE 的代码:

#include <bits/stdc++.h>
using namespace std;

using ull=unsigned long long;
using ll=long long;

ll g[500005];
bool vis[500005];
vector<ll> pri;

ull base[500005];
ull pre[500005];
int n,t;
char str[500005];

inline ull get_hash(int l,int r){
	return pre[r] - pre[l-1] * base[r-l+1];
}

int main(){
	ios::sync_with_stdio(false);
	cin.tie();
	cin>>n>>str+1>>t; 
	for (ll i = 2; i <= n; i++) {
		if (!vis[i])
			pri.push_back(i), g[i] = i;
		for (int j = 0; j < pri.size() && pri[j] * i <= n; j++) {
			vis[pri[j]*i] = true, g[pri[j]*i] = pri[j];
			if (i % pri[j] == 0)
				break;
		}
	}
	base[0]=1ull;
	for(int i = 1; i<=n; i++){
		base[i]=base[i-1]*29ull;
		pre[i]=pre[i-1]*29ull+str[i];
	}
	register int l,r;
	register ll ans,rans;
	while(t--){
		cin>>l>>r;
		ans=rans=r-l+1;
		while(rans>1){
			if(get_hash(l+ans/g[rans],r)==get_hash(l,r-ans/g[rans])){
				ans/=g[rans];
			}
			rans/=g[rans];
		}
		cout<<ans<<'\n';
	}
	return 0;
}

这是一份 AC 的代码:

#include <bits/stdc++.h>
using namespace std;

using ull=unsigned long long;
using ll=long long;

template<typename T> inline void read(T &x) {
	x = 0; T k = 1; char in = getchar();
	while (!isdigit(in)) { if (in == '-') k = -1; in = getchar(); }
	while (isdigit(in)) x = x * 10 + in - '0', in = getchar();
	x *= k;
}

ll g[500005];
bool vis[500005];
vector<ll> pri;

ull base[500005];
ull pre[500005];
int n,t;
char str[500005];

inline ull get_hash(int l,int r){
	return pre[r] - pre[l-1] * base[r-l+1];
}

int main(){
	read(n);
	cin>>str+1;
	read(t);
	for (ll i = 2; i <= n; i++) {
		if (!vis[i])
			pri.push_back(i), g[i] = i;
		for (int j = 0; j < pri.size() && pri[j] * i <= n; j++) {
			vis[pri[j]*i] = true, g[pri[j]*i] = pri[j];
			if (i % pri[j] == 0)
				break;
		}
	}
	base[0]=1ull;
	for(int i = 1; i<=n; i++){
		base[i]=base[i-1]*29ull;
		pre[i]=pre[i-1]*29ull+str[i];
	}
	register int l,r;
	register ll ans,rans;
	while(t--){
		read(l),read(r);
		ans=rans=r-l+1;
		while(rans>1){
			if(get_hash(l+ans/g[rans],r)==get_hash(l,r-ans/g[rans])){
				ans/=g[rans];
			}
			rans/=g[rans];
		}
		cout<<ans<<'\n';
	}
	return 0;
}
2024/5/28 17:24
加载中...