今天复习到这一题,我本来是按照第一篇题解写的,然后我想替换掉第一篇题解在主函数递推 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;
}
我认为这种写法的正确性无法保证,但是它还是过了,所以到底是这题数据太水还是这种写法的正确性可以证明?