bzoj 1031 [JSOI2007]字符加密Cipher

求出来后缀数组的rank就行了,不会可以去看集训队论文。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<vector>
 6 using namespace std;
 7 char c[200005];
 8 int rank[200005],sa[200005];
 9 int n;
10 int a[200005],b[200005],wb[200005],wv[200005],gs[200005];
11 bool cmp(int *x,int a,int b,int l)
12 {
13     return x[a]==x[b]&&x[a+l]==x[b+l];
14 }
15 void da(int *x,int *sa,int n,int m)
16 {
17     int i,j,p,*y=wb;
18     for(i=0;i<m;i++)gs[i]=0;
19     for(i=0;i<n;i++)gs[x[i]]++;
20     for(i=1;i<m;i++)gs[i]+=gs[i-1];
21     for(i=n-1;~i;i--)sa[--gs[x[i]]]=i;
22     for(j=1,p=1;p<n;j<<=1,m=p)
23     {
24         for(i=n-j,p=0;i<n;i++)y[p++]=i;
25         for(i=0;i<n;i++)if(sa[i]>=j)y[p++]=sa[i]-j;
26         for(i=0;i<n;i++)wv[i]=x[y[i]];
27         for(i=0;i<m;i++)gs[i]=0;
28         for(i=0;i<n;i++)gs[wv[i]]++;
29         for(i=1;i<m;i++)gs[i]+=gs[i-1];
30         for(i=n-1;~i;i--)sa[--gs[wv[i]]]=y[i];
31         swap(x,y);x[sa[0]]=0;p=1;
32         for(i=1;i<n;i++)x[sa[i]]=cmp(y,sa[i-1],sa[i],j)?p-1:p++;
33     }
34 }
35 int main()
36 {
37     scanf("%s",c);
38     n=strlen(c);
39     for(int i=n;i<2*n;i++)c[i]=c[i-n];
40     for(int i=0;i<n<<1;i++)rank[i]=c[i];
41     da(rank,sa,n*2+1,256);
42     for(int i=1;i<=n*2;i++)
43     {
44         if(sa[i]+n-1<n*2-1)putchar(c[sa[i]+n-1]);
45     }
46     return 0;
47 }
时间: 2024-12-28 15:50:23

bzoj 1031 [JSOI2007]字符加密Cipher的相关文章

BZOJ 1031: [JSOI2007]字符加密Cipher 后缀数组

1031: [JSOI2007]字符加密Cipher Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 6014  Solved: 2503[Submit][Status][Discuss] Description 喜欢钻研问题的JS同学,最近又迷上了对加密方法的思考.一天,他突然想出了一种他认为是终极的加密办法 :把需要加密的信息排成一圈,显然,它们有很多种不同的读法.例如下图,可以读作: JSOI07 SOI07J OI07JS I07JSO 0

bzoj 1031: [JSOI2007]字符加密Cipher 後綴數組模板題

1031: [JSOI2007]字符加密Cipher Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3157  Solved: 1233[Submit][Status] Description 喜欢钻研问题的JS 同学,最近又迷上了对加密方法的思考.一天,他突然想出了一种他认为是终极的加密办法:把需要加密的信息排成一圈,显然,它们有很多种不同的读法.例如下图,可以读作: JSOI07 SOI07J OI07JS I07JSO 07JSOI 7JS

bzoj 1031 [JSOI2007]字符加密Cipher 后缀数组模板

题目链接 题目描述 喜欢钻研问题的JS同学,最近又迷上了对加密方法的思考.一天,他突然想出了一种他认为是终极的加密办法 :把需要加密的信息排成一圈,显然,它们有很多种不同的读法.例如下图,可以读作: JSOI07 SOI07J OI07JS I07JSO 07JSOI 7JSOI0把它们按照字符串的大小排序:07JSOI 7JSOI0 I07JSO JSOI07 OI07JS SOI07J读出最后一列字符:I0O7SJ,就是加密后的字符串(其实这个加密手段实在很容易破解,鉴于这是突然想出来的,那

BZOJ 题目1031: [JSOI2007]字符加密Cipher(后缀数组sa简单应用)

1031: [JSOI2007]字符加密Cipher Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 4318  Solved: 1760 [Submit][Status][Discuss] Description 喜欢钻研问题的JS 同学,最近又迷上了对加密方法的思考.一天,他突然想出了一种他认为是终极的加密办法:把需要加密的信息排成一圈,显然,它们有很多种不同的读法.例如下图,可以读作: JSOI07 SOI07J OI07JS I07JSO

1031: [JSOI2007]字符加密Cipher

1031: [JSOI2007]字符加密Cipher Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 7338  Solved: 3182[Submit][Status][Discuss] Description 喜欢钻研问题的JS同学,最近又迷上了对加密方法的思考.一天,他突然想出了一种他认为是终极的加密办法 :把需要加密的信息排成一圈,显然,它们有很多种不同的读法.例如下图,可以读作: JSOI07 SOI07J OI07JS I07JSO 0

【BZOJ】1031: [JSOI2007]字符加密Cipher(后缀数组)

http://www.lydsy.com/JudgeOnline/problem.php?id=1031 很容易想到这就是将字符串复制到自己末尾然后后缀数组搞出sa然后按区间输出即可. 然后换了下模板,将基数排序放到外边 #include <cstdio> #include <cstring> #include <cmath> #include <string> #include <iostream> #include <algorithm

BZOJ.1031.[JSOI2007]字符加密(后缀数组)

题目链接 环可以拆成链:对字符串排序能想到后缀数组. 完了.输出时忽略长度不足n的串,输出s[sa[i]+n-1],即排名为i的字符串的末尾. //4140kb 744ms #include <cstdio> #include <cstring> #include <algorithm> const int N=2e5+5; int n,tm[N],sa[N],rk[N],sa2[N]; char s[N]; void Get_SA() { int m=130,*x=r

[JSOI2007]字符加密Cipher

1031: [JSOI2007]字符加密Cipher Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 7384  Solved: 3198 [Submit][Status][Discuss] Description 喜欢钻研问题的JS同学,最近又迷上了对加密方法的思考.一天,他突然想出了一种他认为是终极的加密办法 :把需要加密的信息排成一圈,显然,它们有很多种不同的读法.例如下图,可以读作: JSOI07 SOI07J OI07JS I07JSO

[JSOI2007]字符加密Cipher SA

[JSOI2007]字符加密Cipher Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 7859  Solved: 3410[Submit][Status][Discuss] Description 喜欢钻研问题的JS同学,最近又迷上了对加密方法的思考.一天,他突然想出了一种他认为是终极的加密办法 :把需要加密的信息排成一圈,显然,它们有很多种不同的读法.例如下图,可以读作: JSOI07 SOI07J OI07JS I07JSO 07JSOI