社区讨论

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 条回复,欢迎继续交流。

正在加载回复...