zoukankan      html  css  js  c++  java
  • bzoj1031 [JSOI2007]字符加密Cipher

    Description

    喜欢钻研问题的JS 同学,最近又迷上了对加密方法的思考。一天,他突然想出了一种他认为是终极的加密办法:把需要加密的信息排成一圈,显然,它们有很多种不同的读法。例如下图,可以读作:

     

    JSOI07 SOI07J OI07JS I07JSO 07JSOI 7JSOI0 把它们按照字符串的大小排序: 07JSOI 7JSOI0 I07JSO JSOI07 OI07JS SOI07J 读出最后一列字符:I0O7SJ,就是加密后的字符串(其实这个加密手段实在很容易破解,鉴于这是突然想出来的,那就^^)。但是,如果想加密的字符串实在太长,你能写一个程序完成这个任务吗?

    Input

    输入文件包含一行,欲加密的字符串。注意字符串的内容不一定是字母、数字,也可以是符号等。

    Output

    输出一行,为加密后的字符串。

    Sample Input

    JSOI07

    Sample Output

    I0O7SJ

    HINT

    对于100%的数据字符串的长度不超过100000。

    后缀数组第一题

    听说这是SA裸题……但是一开始我还没看出来怎么搞

    先把串复制两倍,然后SA搞完直接输出排名前n/2的首字符前一位的字符

    #include<cstdio>
    #include<cstring>
    #include<iostream>
    using namespace std;
    #define N 200010
    char ch[N];
    int a[N],v[N],n,k,p,q;
    int sa[2][N],rnk[2][N];
    inline void calc_sa(int sa[N],int rnk[N],int SA[N],int RNK[N])
    {
        for (int i=1;i<=n;i++)v[rnk[sa[i]]]=i;
        for (int i=n;i>=1;i--)
            if (sa[i]>k)SA[v[rnk[sa[i]-k]]--]=sa[i]-k;
        for (int i=n-k+1;i<=n;i++)SA[v[rnk[i]]]=i;
        for (int i=1;i<=n;i++)
        RNK[SA[i]]=RNK[SA[i-1]]+(rnk[SA[i]]!=rnk[SA[i-1]]||rnk[SA[i-1]+k]!=rnk[SA[i]+k]);
    }
    inline void get_sa()
    {
        p=0,q=1;a[0]=-1;
        memset(v,0,sizeof(v));
        for (int i=1;i<=n;i++)v[a[i]]++;
        for (int i=1;i<=256;i++)v[i]+=v[i-1];
        for (int i=1;i<=n;i++)sa[p][v[a[i]]--]=i;
        for (int i=1;i<=n;i++)
            rnk[p][sa[p][i]]=rnk[p][sa[p][i-1]]+(a[sa[p][i]]!=a[sa[p][i-1]]);
        for (k=1;k<n;k<<=1,swap(p,q))
            calc_sa(sa[p],rnk[p],sa[q],rnk[q]);
    }
    int main()
    {
        scanf("%s",ch+1);
        n=strlen(ch+1);
        for (int i=1;i<=n;i++)
        {
            a[i]=ch[i];
            a[i+n]=a[i];
            ch[i+n]=ch[i];
        }
        n*=2;
        get_sa();
        ch[0]=ch[n];
        for (int i=1;i<=n;i++)
            if(sa[p][i]<=n/2)printf("%c",ch[sa[p][i]-1]);
        return 0;
    }
    
    ——by zhber,转载请注明来源
  • 相关阅读:
    awk中执行Linux命令的两种方式
    Hibernate-validator校验含javax.validation.constraints注解的对象其首次校验长耗时问题
    Linux系统查看端口常用命令
    简要记录搭建Nexus私服过程(发布和使用)
    简要记录搭建Nexus私服过程(配置)
    简要记录搭建Nexus私服过程(安装)
    [转载] jar包和war包的介绍和区别
    linux-exec
    linux-vim格式设置
    linux-array
  • 原文地址:https://www.cnblogs.com/zhber/p/4223098.html
Copyright © 2011-2022 走看看