社区讨论
manacher求助
P3805【模板】Manacher参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mhizjmdi
- 此快照首次捕获于
- 2025/11/03 18:16 4 个月前
- 此快照最后确认于
- 2025/11/03 18:16 4 个月前
CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e7;
string s;
vector<int>d1(N),d2(N);
signed main()
{
cin>>s;
int n=s.length();
for(int i=0,l=0,r=-1;i<n;i++)
{
int k=(i>r?1:min(d1[l+r-i],r-i+1));
while(i-k>=0&&i+k<n&&s[i-k]==s[i+k])k++;
d1[i]=k--;
if(i+k>r)
{
l=i-k;
r=i+k;
}
}
for(int i=0,l=0,r=-1;i<n;i++)
{
//这里d2[l+r-i]为什么不行,对称点不就是l+r-i吗
int k=(i>r?0:min(d2[l+r-i+1],r-i+1));
while(i-k-1>=0&&i+k<n&&s[i-k-1]==s[i+k])k++;
d2[i]=k--;
if(i+k>r)
{
l=i-k-1;
r=i+k;
}
}
int ans=0;
for(int i=0;i<n;i++)ans=max(ans,max(d1[i]*2-1,d2[i]*2));
cout<<ans;
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...