求问manacher
  • 板块学术版
  • 楼主CNS_5t0_0r2
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/8/8 11:19
  • 上次更新2024/8/8 12:12:39
查看原帖
求问manacher
999274
CNS_5t0_0r2楼主2024/8/8 11:19

原题链接

今天复习到这一题,我本来是按照第一篇题解写的,然后我想替换掉第一篇题解在主函数递推 l,r 的部分,写出了如下代码:

#include<bits/stdc++.h>
using namespace std; 
const int N = 11e6 + 9;
char s[N << 1];
int p[N << 1],len,ans;
int l[N << 1],r[N << 1];
void read(){
	char c = getchar();len = 1;
	s[0] = '~';s[len] = '|';
	while(c < 'a' || c > 'z')
		c = getchar();
	while(c >= 'a' && c <= 'z'){
		s[++len] = c;
		s[++len] = '|';
		c = getchar();
	}
}
int main(){
	read();
	for(int i = 1,mx = 0,id = 0;i <= len;i++){
		p[i] = i <= mx ? min(p[(id << 1) - i],mx - i + 1) : 1;
		l[i - (p[i] - 1)] = max(l[i - (p[i] - 1)], p[i] - 1);
		r[i + (p[i] - 1)] = max(r[i + (p[i] - 1)], p[i] - 1);
		while(s[i - p[i]] == s[i + p[i]]){
			++p[i];
		   	l[i - (p[i] - 1)] = max(l[i - (p[i] - 1)], p[i] - 1);
		    r[i + (p[i] - 1)] = max(r[i + (p[i] - 1)], p[i] - 1);
		}
	    if(p[i] + i - 1 > mx){
			mx = p[i] + i - 1;
			id = i;
		}
	}
// 	for (int i = 1; i <= len; i += 2)
// 		l[i] = max(l[i], l[i - 2] - 2);
// 	for (int i = len; i >= 1; i -= 2)
// 		r[i] = max(r[i], r[i + 2] - 2);
	for (int i = 1; i <= len; i += 2)
		if(l[i] && r[i])
			ans = max(ans, l[i] + r[i]);
	printf("%d",ans);
	return 0;
}

我认为这种写法的正确性无法保证,但是它还是过了,所以到底是这题数据太水还是这种写法的正确性可以证明?

2024/8/8 11:19
加载中...