全 Re 求助,悬 1 关
查看原帖
全 Re 求助,悬 1 关
807774
_Wind_Leaves_ShaDow_楼主2024/6/10 11:10

rt,刚学 SA,可能是超级基础的错误,谢谢啦。

#include <bits/stdc++.h>
//#define int long long
#define Rg register
#define Ri Rg int
#define Il inline
#define vec vector
#define pb push_back
#define fi first
#define se second
#define IT ::iterator

using namespace std;

typedef double db;
typedef pair<int,int> pii;
const int N=5e5,Inf=1e9;
const db eps=1e-8;

int n,fa[N+5][20],de[N+5];
int g[130],sa[N+5],ts[N+5],rk[N+5],tk[(N<<1)+5];
vec<int>v[N+5];
string s;

Il void dfs(int p){
	for(Ri i=1;i<19;i++)fa[p][i]=fa[fa[p][i-1]][i-1];
	de[p]=de[fa[p][0]]+1;
	for(Ri i:v[p])dfs(i);
	return;
}

Il void SA(){
	int ms=125;
	s=" "+s;
	for(Ri i=1;i<=n;i++){
		rk[i]=s[i];
		g[rk[i]]++;
	}
	for(Ri i=1;i<=ms;i++)g[i]+=g[i-1];
	for(Ri i=n;i;i--)sa[g[rk[i]]--]=i;
	for(Ri k=1;(1<<k)<=n;k++){
		memset(g,0,sizeof(g));
		int sn=0,kn=0;
		for(Ri i=1;i<=n;i++){
			if(fa[i][k])continue;
			ts[++sn]=i;
		}
		for(Ri i=0;i<=n;i++)v[i].resize(0);
		for(Ri i=1;i<=n;i++)if(fa[i][k])v[fa[i][k]].pb(i);
		for(Ri i=1;i<=n;i++){
			g[rk[i]]++;
			if(v[sa[i]].empty())continue;
			for(Ri j:v[sa[i]])ts[++sn]=j;
		}
		for(Ri i=1;i<=ms;i++)g[i]+=g[i-1];
		for(Ri i=n;i;i--)sa[g[rk[ts[i]]]--]=ts[i];
		memcpy(tk,rk,sizeof(rk));
		for(Ri i=1;i<=n;i++)rk[sa[i]]=((tk[sa[i]]==tk[sa[i-1]]&&tk[fa[sa[i]][k]]==tk[fa[sa[i-1]][k]])?kn:++kn);
		if(kn==n)return;
		ms=kn;
	}
	memset(g,0,sizeof(g));
	for(Ri i=1;i<=n;i++)g[rk[i]]++;
	for(Ri i=1;i<=ms;i++)g[i]+=g[i-1];
	for(Ri i=1;i<=n;i++)rk[i]=g[rk[i]-1]+1;
	return;
}

Il bool cmp(int x,int y){
	return rk[x]<rk[y];
}

Il bool cmp1(int x,int y){
	return ((fa[x][0]^fa[y][0])?rk[fa[x][0]<rk[fa[y][0]]]:x<y);
}

Il void Sort(int d,int l,int r){
	sort(v[d].begin()+l,v[d].begin()+r,cmp1);
	int tmp=rk[v[d][l]]-1;
	for(Ri i=l;i<r;i++)rk[v[d][i]]=++tmp;
	return;
}

signed main(){
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	cin>>n;
	for(Ri i=2;i<=n;i++){
		cin>>fa[i][0];
		v[fa[i][0]].pb(i);
	}
	cin>>s;
	dfs(1);
	SA();
	for(Ri i=1;i<=n;i++)v[i].resize(0);
	for(Ri i=1;i<=n;i++)v[de[i]].pb(i);
	rk[0]=0;
	for(Ri i=1;!v[i].empty();i++){
		sort(v[i].begin(),v[i].end(),cmp);
		int lst=0;
		v[i].pb(0);
		for(Ri j=1;j<v[i].size();j++){
			if(rk[v[i][j]]==rk[v[i][j-1]])continue;
			if(lst^(j-1))Sort(i,lst,j);
			lst=j;
		}
	}
	for(Ri i=1;i<=n;i++)sa[rk[i]]=i;
	for(Ri i=1;i<=n;i++)cout<<sa[i]<<' ';
	return 0;
}
2024/6/10 11:10
加载中...