写个cmp然后sort就好了。
cmp的话,需要快速知道两个串的lcp,于是倍增+Hash即可。
#include<cstdio> #include<algorithm> typedef long long ll; const int N=100010,M=18,P=1000000009; int n,i,j,k,f[N][M],a[N];char s[N],ch[10];ll pow[1<<M],h[N][M]; bool cmp(int x,int y){ if(h[x][M-1]==h[y][M-1])return x<y; for(int i=M-2;~i;i--)if(h[x][i]==h[y][i])x=f[f[x][i]][1],y=f[f[y][i]][1]; return h[x][0]<h[y][0]; } int main(){ for(pow[0]=1,i=1;i<(1<<M);i++)pow[i]=pow[i-1]*233%P; for(scanf("%d",&n),i=1;i<=n;i++)scanf("%s",ch),h[i][0]=ch[0],a[i]=f[i][0]=i; for(i=1;i<=n;i++)scanf("%d",&f[i][1]),h[i][1]=h[i][0]*233+h[f[i][1]][0]; for(j=2;j<M;j++)for(i=1;i<=n;i++)f[i][j]=f[f[f[i][j-1]][1]][j-1],h[i][j]=(h[i][j-1]*pow[1<<j-1]+h[f[f[i][j-1]][1]][j-1])%P; for(std::sort(a+1,a+n+1,cmp),i=1;i<=n;i++)printf("%d ",a[i]); return 0; }