社区讨论
已过,求问关于Manacher头尾添加字符
P9606[CERC2019] ABB参与者 2已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @mj011j1g
- 此快照首次捕获于
- 2025/12/10 21:10 3 个月前
- 此快照最后确认于
- 2025/12/10 21:17 3 个月前
蒟蒻求问:
Manacher对于字符串处理时,开头结尾添加特殊字符,对于实现有何影响?
以下为AC代码:
CPP#include<bits/stdc++.h>
using namespace std;
const int maxL=4e5+5;
string st;
int len[maxL*2],t[maxL*2];
int n;
int cnt,r;
int exec(int i){
return ((cnt-2)-(2*len[i]-1))/2;
}
int main()
{
cin>>n>>st;
t[++cnt]='#'; //**与WA代码的差别**
t[++cnt]='$';
for(int i=0;i<st.size();i++)
{
t[++cnt]=st[i];
t[++cnt]='$';
}
t[++cnt]='^'; //**与WA代码的差别**
int mid=1;
for(int i=1;i<=cnt;i++)
{
int j=2*mid-i;
if(i<=r) len[i]=min(len[j],r-i+1);
while(t[i-len[i]]==t[i+len[i]]) len[i]++;
if(i+len[i]-1>r) mid=i,r=i+len[i]-1;
}
int ans=st.size()-1;
for(int i=cnt-1;i>=2;i--)
if(i+len[i]-1==cnt-1)
ans=min(ans,exec(i));
cout<<ans;
return 0;
}
以下为WA算法:
CPP#include<bits/stdc++.h>
using namespace std;
const int maxL=4e5+5;
string st;
int len[maxL*2],t[maxL*2];
int n;
int cnt,r;
int exec(int i){
return (cnt-(2*len[i]-1))/2;
}
int main()
{
cin>>n>>st;
//t[++cnt]='#';
t[++cnt]='$';
for(int i=0;i<st.size();i++)
{
t[++cnt]=st[i];
t[++cnt]='$';
}
//t[++cnt]='^';
int mid=1;
for(int i=1;i<=cnt;i++)
{
int j=2*mid-i;
if(i<=r) len[i]=min(len[j],r-i+1);
while(t[i-len[i]]==t[i+len[i]]) len[i]++;
if(i+len[i]-1>r) mid=i,r=i+len[i]-1;
}
int ans=st.size()-1;
for(int i=cnt;i>=1;i--)
{
if(i+len[i]-1==cnt)
{
ans=min(ans,exec(i));
}
}
cout<<ans;
return 0;
}
回复
共 2 条回复,欢迎继续交流。
正在加载回复...