关于PAM
  • 板块学术版
  • 楼主suisdavid
  • 当前回复1
  • 已保存回复1
  • 发布时间2023/3/23 21:36
  • 上次更新2023/10/23 20:44:40
查看原帖
关于PAM
748327
suisdavid楼主2023/3/23 21:36

今天在做P5555时,我意外地把PAM中两句语句调换了顺序。这是错误的PAM代码

struct PAM
{
	int len[maxn],fail[maxn],ch[maxn][26],tot,lst;string s;
	PAM()
	{
		tot=1;fail[0]=1;len[1]=-1;
	}
	int getfail(int u,int i)
	{
		while (i-len[u]-1<0||s[i-len[u]-1]!=s[i])
		{
			u=fail[u];
		} 
		return u;
	} 
	void _insert(int i)
	{
		int id=s[i]-'a',p=getfail(lst,i);
		if (!ch[p][id])
		{
			
			ch[p][id]=++tot;
			len[tot]=len[p]+2;
			fail[tot]=ch[getfail(fail[p],i)][id];
		}
		lst=ch[p][id];
	}
}

这是正确的PAM代码:

struct PAM
{
	int len[maxn],fail[maxn],ch[maxn][26],tot,lst;string s;
	PAM()
	{
		tot=1;fail[0]=1;len[1]=-1;
	}
	int getfail(int u,int i)
	{
		while (i-len[u]-1<0||s[i-len[u]-1]!=s[i])
		{
			u=fail[u];
		} 
		return u;
	} 
	void _insert(int i)
	{
		int id=s[i]-'a',p=getfail(lst,i);
		if (!ch[p][id])
		{
			fail[++tot]=ch[getfail(fail[p],i)][id];
			ch[p][id]=tot;
			len[tot]=len[p]+2;
		}
		lst=ch[p][id];
	}
}

两者区别在于加入新节点时,是先处理fail指针,还是先处理ch指针,不知道为什么这样就会导致错误。

2023/3/23 21:36
加载中...