社区讨论

已过,求问关于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 条回复,欢迎继续交流。

正在加载回复...