5个TLE 求调
查看原帖
5个TLE 求调
1064269
Silicon12345楼主2024/6/2 17:44
#include<iostream>
#include<iomanip>
#include<cmath>
#include<string.h>
#include<queue>
#include<algorithm>
using namespace std;
const int bn=32000005;
char exs[bn],s[bn];
int d[bn];
inline void edit(const char* s){
	int len = strlen(s);
	int k=0;
	exs[0]='$';
	exs[++k]='#';//要形成形如"$#a#b#c#d#\0"这种字符才行,保证必然是奇数个字符,必然对称
	for(int i=0;i<len;i++){
		exs[++k]=s[i];exs[++k]='#';
	}
	exs[++k]='\0';
}
void solve(){
    scanf("%s", s);
    edit(s);
	int nlen=strlen(exs);
	int l=0,r=0,symi=0;d[0]=0;d[1]=1;
	int maxv=d[1];
	for(int i=2;i<nlen;i++){
		if(l<=i&&i<=r) symi=l+r-i,d[i]=min(d[symi],r-i+1);//因为d[i]的回文半径也是加了1的,这里也要补齐,从它本身开始计算回文半径ji
		while(exs[i+d[i]]==exs[i-d[i]]) d[i]++;
		if(l>i-d[i]+1) r=i+d[i]-1, l=i-d[i]+1; //更新盒子的长度,在盒子里面的都可以直接用对称原理求得
		if(d[i]>maxv){
			maxv=d[i];
		}
	}
	printf("%d\n",maxv-1);
}
int main() {
	//ios::sync_with_stdio(false);
	int t;cin>>t;
	while(t--){
		solve();	
	}
	
    return 0;
}

大佬们,我已经尽我所能在优化了,但是还是TLE,我不知道那里出问题了

2024/6/2 17:44
加载中...