zoukankan      html  css  js  c++  java
  • 后缀数组 1031: [JSOI2007]字符加密Cipher

    /*1031: [JSOI2007]字符加密Cipher

    Time Limit: 10 Sec Memory Limit: 162 MB
    Submit: 4926 Solved: 2020
    [Submit][Status][Discuss]
    Description

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

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

    Input

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

    Output

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

    Sample Input

    JSOI07
    Sample Output

    I0O7SJ*/
    //裸裸的后缀数组,裸的不能再裸了。不过因为开了一个局部变量覆盖了全局变量,调试了很长时间。
    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #define N 200005
    using namespace std;
    int a[N],v[N],sa[2][N],rk[2][N],n,k;
    char ch[N];
    void jin(int sa[N],int rk[N],int SA[N],int RK[N])
    {
    for(int i=1;i<=n;i++)
    v[rk[sa[i]]]=i;
    for(int i=n;i;i--)
    if(sa[i]>k)
    SA[v[rk[sa[i]-k]]--]=sa[i]-k;
    for(int i=n-k+1;i<=n;i++)
    SA[v[rk[i]]--]=i;
    for(int i=1;i<=n;i++)
    RK[SA[i]]=RK[SA[i-1]]+(rk[SA[i]]!=rk[SA[i-1]]||rk[SA[i]+k]!=rk[SA[i-1]+k]);//这里要比较rk[],而不是ch[].
    return;
    }
    int main()
    {
    scanf("%s",ch+1);
    int p=0,q=1;
    n=strlen(ch+1);
    for(int i=1;i<=n;i++)
    {
    a[i]=int(ch[i]);
    a[i+n]=a[i];
    ch[i+n]=ch[i];
    }
    n<<=1;
    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++)
    rk[p][sa[p][i]]=rk[p][sa[p][i-1]]+(a[sa[p][i]]!=a[sa[p][i-1]]);
    for( k=1;k<n;k<<=1)
    {
    jin(sa[p],rk[p],sa[q],rk[q]);
    swap(p,q);
    }
    for(int i=1;i<=n;i++)
    if(sa[p][i]<=n/2)
    printf("%c",ch[sa[p][i]+n/2-1]);
    }

  • 相关阅读:
    mysql 历史版本下载
    mysql 5.7 版本 You must reset your password using ALTER USER statement before executing this statement报错处理
    5.7 zip 版本的安装 以及遇到的坑
    mysql 5.6zip版本的卸载与5.7 zip 版本的安装
    mysql数据库的备份与还原
    本地Navicat连接docker里的mysql
    docker修改数据库密码
    docker 在push镜像到本地registry出现的500 Internal Server Error
    linux 没有界面内容显示不全解决办法
    json与map互相转换
  • 原文地址:https://www.cnblogs.com/xydddd/p/5151316.html
Copyright © 2011-2022 走看看