zoukankan      html  css  js  c++  java
  • 【BZOJ1031】字符加密(后缀数组)

    【BZOJ1031】字符加密(后缀数组)

    题面

    BZOJ
    洛谷

    题解

    把字符串倍长
    然后直接求后缀数组,
    拍好序之后直接输出就行了。
    (我只是复习一下(SA)而已)

    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    #include<set>
    #include<map>
    #include<vector>
    #include<queue>
    using namespace std;
    #define ll long long
    #define RG register
    #define MAX 222222
    inline int read()
    {
        RG int x=0,t=1;RG char ch=getchar();
        while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
        if(ch=='-')t=-1,ch=getchar();
        while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
        return x*t;
    }
    char ch[MAX];
    int n,N;
    int t[MAX],a[MAX],x[MAX],y[MAX],SA[MAX];
    bool cmp(int i,int j,int k){return y[i]==y[j]&&y[i+k]==y[j+k];}
    void GetSA()
    {
    	int m=500;
    	for(int i=1;i<=n;++i)t[x[i]=a[i]]++;
    	for(int i=1;i<=m;++i)t[i]+=t[i-1];
    	for(int i=n;i>=1;--i)SA[t[x[i]]--]=i;
    	for(int k=1;k<=n;k<<=1)
    	{
    		int p=0;
    		for(int i=1;i<=n;++i)y[i]=0;
    		for(int i=n-k+1;i<=n;++i)y[++p]=i;
    		for(int i=1;i<=n;++i)if(SA[i]>k)y[++p]=SA[i]-k;
    		for(int i=1;i<=m;++i)t[i]=0;
    		for(int i=1;i<=n;++i)t[x[y[i]]]++;
    		for(int i=1;i<=m;++i)t[i]+=t[i-1];
    		for(int i=n;i>=1;--i)SA[t[x[y[i]]]--]=y[i];
    		swap(x,y);
    		x[SA[1]]=p=1;
    		for(int i=2;i<=n;++i)x[SA[i]]=cmp(SA[i],SA[i-1],k)?p:++p;
    		if(p>=n)break;
    		m=p;
    	}
    }
    int main()
    {
    	scanf("%s",ch+1);N=strlen(ch+1);
    	for(int i=1;i<=N;++i)a[++n]=ch[i];
    	for(int i=1;i<=N;++i)a[++n]=ch[i];
    	GetSA();
    	for(int i=1;i<=n;++i)
    		if(SA[i]<=N)putchar(char(a[SA[i]+N-1]));
    	puts("");
    	return 0;
    }
    
    
  • 相关阅读:
    Linux学习之路3-HelloWorld
    Linux学习之路2-linux系统烧写
    Linux学习之路1
    linux常用命令总结
    禅道配置发邮件功能
    SHELVE模块
    PICKLE模块
    JSON_dump和load
    json.dumps和loads方法
    模块调用
  • 原文地址:https://www.cnblogs.com/cjyyb/p/9101976.html
Copyright © 2011-2022 走看看