zoukankan      html  css  js  c++  java
  • BZOJ_1031_[JSOI2007]_字符串加密_(后缀数组)

    描述


    http://www.lydsy.com/JudgeOnline/problem.php?id=1031

    长度为n的字符串形成环,枚举开头位置,得到n个长度为n的串,将这些串排序,然后按照顺序输出每一个串的最后一个字符.

    分析


    将原串复制一遍接在自己的后面,这样n个串都在总串里面出现了.

    对于这n个串中的两个a,b,如果a<b,那么以a开头的后缀就<以b开头的后缀.

    所以我们求一下后缀数组就好了.

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 
     4 const int maxn=200000+5;
     5 int n;
     6 int t1[maxn],t2[maxn],sa[maxn],c[maxn];
     7 char s[maxn];
     8 
     9 void build_sa(char *s,int n,int m){
    10     int i,k,p,*x=t1,*y=t2,*t;
    11     for(i=0;i<m;i++) c[i]=0;
    12     for(i=0;i<n;i++) c[x[i]=s[i]-'']++;
    13     for(i=1;i<m;i++) c[i]+=c[i-1];
    14     for(i=0;i<n;i++) sa[--c[x[i]]]=i;//
    15     for(k=1,p=1;p<n;k<<=1,m=p){
    16         for(p=0,i=n-k;i<n;i++) y[p++]=i;//
    17         for(i=0;i<n;i++)if(sa[i]>=k) y[p++]=sa[i]-k;
    18         for(i=0;i<m;i++) c[i]=0;
    19         for(i=0;i<n;i++) c[x[i]]++;//
    20         for(i=1;i<m;i++) c[i]+=c[i-1];
    21         for(i=n-1;i>=0;i--) sa[--c[x[y[i]]]]=y[i];
    22         for(t=x,x=y,y=t,p=1,x[sa[0]]=0,i=1;i<n;i++)
    23             x[sa[i]]=y[sa[i]]==y[sa[i-1]]&&y[sa[i]+k]==y[sa[i-1]+k]?p-1:p++;
    24     }
    25 }
    26 int main(){
    27     scanf("%s",s+1); n=strlen(s+1);
    28     for(int i=1;i<=n;i++) s[n+i]=s[i];
    29     s[0]='';
    30     build_sa(s,n*2+1,maxn);
    31     for(int i=1;i<=2*n;i++) if(sa[i]<=n) printf("%c",s[sa[i]+n-1]);
    32     return 0;
    33 }
    View Code

    1031: [JSOI2007]字符加密Cipher

    Time Limit: 10 Sec  Memory Limit: 162 MB
    Submit: 5706  Solved: 2387
    [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

    HINT

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

    Source

  • 相关阅读:
    prototype.js超强的javascript类库
    MySQL Server Architecture
    Know more about RBA redo block address
    MySQL无处不在
    利用Oracle Enterprise Manager Cloud Control 12c创建DataGuard Standby
    LAMP Stack
    9i中DG remote archive可能导致Primary Database挂起
    Oracle数据库升级与补丁
    Oracle为何会发生归档日志archivelog大小远小于联机重做日志online redo log size的情况?
    Oracle Ksplice如何工作?How does Ksplice work?
  • 原文地址:https://www.cnblogs.com/Sunnie69/p/5615552.html
Copyright © 2011-2022 走看看