为什么PAM是线性时间复杂度?
查看原帖
为什么PAM是线性时间复杂度?
114502
little_brush楼主2021/6/7 20:52
inline int Get_Fail(int x,int i)
{
	while(c[i]!=c[i-len[x]-1]) x=last[x];
	return x;
}
int main()
{
	last[0]=1; len[1]=-1;
	scanf("%s",c+1); n=strlen(c+1); c[0]='~';
	int lastans=0,now=1;
	for(int i=1;i<=n;i++)
	{
		c[i]=(c[i]-97+lastans)%26+97;
		now=Get_Fail(now,i);
		if(!tree[now][c[i]-'a'])
		{
			last[++tot]=tree[Get_Fail(last[now],i)][c[i]-'a'];
			tree[now][c[i]-'a']=tot; f[tot]=f[last[tot]]+1;
			len[tot]=len[now]+2;
		}
		now=tree[now][c[i]-'a'];
		lastans=f[now];
		printf("%d ",lastans);
	}
	printf("\n");
	return 0;
}

关于这段代码,个人认为不能按照类似 KMPKMP 的方式计算复杂度。原因是:

last[++tot]=tree[Get_Fail(last[now],i)][c[i]-'a'];

这段代码虽然调用了 Get_Fail() 函数,但是 now 并没有移动到相应的位置,所以复杂度会退化吗?

2021/6/7 20:52
加载中...