zoukankan      html  css  js  c++  java
  • 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
    ",a[i]);
      return 0;
    }
    

      

  • 相关阅读:
    最短Hamilton路径-状压dp解法
    泡芙
    斗地主
    楼间跳跃
    联合权值
    虫食算
    抢掠计划
    间谍网络
    城堡the castle
    【模板】缩点
  • 原文地址:https://www.cnblogs.com/clrs97/p/4403184.html
Copyright © 2011-2022 走看看