求助,为何会TLE?
查看原帖
求助,为何会TLE?
358971
朦胧_XY楼主2023/3/28 15:20

TLE代码:

#include <iostream>
using namespace std;
const int N = 44000005;
int n, hw[N], ans = 1;
char c, s[N << 1];
void manacher(){
	int mxr = 0, mid;
	for(int i = 1; i < n; i++){
		if(i < mxr)
			hw[i] = min(hw[(mid << 1) - i], hw[mid] + mid - i);
		else hw[i] = 1;
		while(s[i + hw[i]] == s[i - hw[i]]) hw[i]++;
	    if(hw[i] + i > mxr){
	        mxr = hw[i] + i;
	        mid = i;
		}
	}
}
int main(){
	c = getchar();
	s[0] = s[++n] = '#';
	while(c != '\n'){
		s[++n] = c;
		s[++n] = '#';
		c = getchar();
	}
	s[++n] = 0;
	manacher();
	for(int i = 0; i < n; i++)
		ans = max(ans, hw[i]);
	printf("%d", ans - 1);
	return 0;
}

AC代码:

#include <iostream>
#include <cstring>
using namespace std;
const int N = 11000005;
int n, hw[N << 1], ans = 1;
char a[N << 1], s[N << 1], c;
void manacher(){
	int mxr = 0, mid;
	for(int i = 1; i < n; i++){
		if(i < mxr)
			hw[i] = min(hw[(mid << 1) - i], hw[mid] + mid - i);
		else hw[i] = 1;
		while(s[i + hw[i]] == s[i - hw[i]]) hw[i]++;
	    if(hw[i] + i > mxr){
	        mxr = hw[i] + i;
	        mid = i;
		}
	}
}
void change(){
    s[0] = s[1] = '#';
    for(int i = 0; i < n; i++){
        s[(i << 1) + 2] = a[i];
        s[(i << 1) + 3] = '#';
    }
    n = n + 1 << 1;
    s[n] = 0;
}
int main(){
	scanf("%s", a);
	n = strlen(a);
	change();
	manacher();
	for(int i = 0; i < n; i++)
		ans = max(ans, hw[i]);
	printf("%d", ans - 1);
	return 0;
}

两份代码只是在输入上不同,其中超时的一个是边输入边加'#',另一个是输入完再改。

2023/3/28 15:20
加载中...