• 后缀数组 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]);
    }

  • 相关阅读:
    C# 函数参数object sender, EventArgs e
    Winform中利用委托实现窗体之间的传值
    Web前端学习笔记——Canvas
    js 删除 按钮所在的行
    box-sizing
    前端中关于HTML标签的属性for的理解
    apply和call的用法总结
    target 确定元素是谁??
    css3过渡和动画
    处理两端极限值的小技巧
  • 原文地址:https://www.cnblogs.com/xydddd/p/5151316.html
Copyright © 2020-2023  润新知