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;
}

  

 

posted @ 2014-12-17 11:26  Claris  阅读(234)  评论(0编辑  收藏  举报