关于后缀数组优化和卡常
  • 板块学术版
  • 楼主封禁用户
  • 当前回复16
  • 已保存回复16
  • 发布时间2023/7/17 07:25
  • 上次更新2023/11/3 09:25:50
查看原帖
关于后缀数组优化和卡常
526677
封禁用户楼主2023/7/17 07:25

据说可以压缩几个for,但是没找到咋整。

void work(){
	for(re int i=1;i<=n;++i) rk[i]=s[i]-'a'+1,++bu[rk[i]];
	for(re int i=2;i<=lim;++i) bu[i]+=bu[i-1];
	for(re int i=n;i>=1;--i) SA[bu[rk[i]]--]=i;
	for(re int k=1;k<=n;k<<=1){
		ll cnt=0;
		for(re int i=1;i<=k;++i) w2[++cnt]=n-k+i;
		for(re int i=1;i<=n;++i)
			if(SA[i]>k) w2[++cnt]=SA[i]-k;
		for(re int i=1;i<=lim;++i) bu[i]=0;
		for(re int i=1;i<=n;++i) bu[rk[i]]++;
		for(re int i=2;i<=lim;++i) bu[i]+=bu[i-1];
		for(re int i=n;i>=1;--i) SA[bu[rk[w2[i]]]--]=w2[i];
		swap(rk,w2);
		cnt=1,rk[SA[1]]=1;
		for(re int i=2;i<=n;++i)
			rk[SA[i]]=(w2[SA[i-1]]==w2[SA[i]]&&w2[SA[i-1]+k]==w2[SA[i]+k])?cnt:++cnt;
		if(cnt==n) break;
		lim=cnt;
	}
}

不会SA-IS,只想卡常。

2023/7/17 07:25
加载中...