• uoj35 后缀排序


    http://uoj.ac/problem/35

    #include<cstdio>
    #include<cstring>
    #define FOR(i,s,t) for(register int i=s;i<=t;++i)
    #define ROF(i,s,t) for(register int i=s;i>=t;--i)
    const int maxn=100011;
    int n,m,p;
    char S[maxn];
    int a[maxn],v[maxn],h[maxn],sa[2][maxn],rk[2][maxn];
    inline void mul(int k){
    	FOR(i,1,n)v[rk[p][sa[p][i]]]=i;
    	ROF(i,n,1)if(sa[p][i]>k)sa[p^1][v[rk[p][sa[p][i]-k]]--]=sa[p][i]-k;
    	FOR(i,n-k+1,n)sa[p^1][v[rk[p][i]]--]=i;
    	FOR(i,1,n)rk[p^1][sa[p^1][i]]=rk[p^1][sa[p^1][i-1]]+(rk[p][sa[p^1][i]]!=rk[p][sa[p^1][i-1]]||rk[p][sa[p^1][i]+k]!=rk[p][sa[p^1][i-1]+k]);
    }
    inline void presa(){
    	FOR(i,1,n)a[i]=S[i]-'a'+1;
    	FOR(i,1,n)++v[a[i]];
    	FOR(i,1,30)v[i]+=v[i-1];
    	FOR(i,1,n)sa[p][v[a[i]]--]=i;
    	FOR(i,1,n)rk[p][sa[p][i]]=rk[p][sa[p][i-1]]+(a[sa[p][i]]!=a[sa[p][i-1]]);
    	for(register int k=1;k<n;k<<=1,p^=1)mul(k);
    	for(register int i=1,j,k=0;i<=n;++i){
    		j=sa[p][rk[p][i]-1];
    		while(S[i+k]==S[j+k])++k;
    		h[rk[p][i]]=k;if(k)--k;
    	}
    }
    int main(){
    	scanf("%s",S+1);
    	n=strlen(S+1);
    	presa();
    	FOR(i,1,n)printf("%d ",sa[p][i]);
    	puts("");
    	FOR(i,2,n)printf("%d ",h[i]);
    	return 0;
    }
    

      

  • 相关阅读:
    Ubuntu18.04 Hadoop Standalone
    Shiro安全框架
    链表中环的的入口节点
    二维数组中的查找
    ElasticSearch快速入门
    logback日志配置
    RabbitMQ进阶笔记
    RabbitMQ入门笔记
    JUC-Lock锁及常用工具类
    Java中的线程池
  • 原文地址:https://www.cnblogs.com/Stump/p/8245277.html
Copyright © 2020-2023  润新知