BZOJ2062 : 素颜2(face2)

写个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\n",a[i]);

  return 0;

}

  

 

你可能感兴趣的:(ZOJ)