[bzoj1031][JSOI2007]字符加密Cipher

  显然把原串复制一遍,然后排序长度为len的各个后缀就行了。

  我只是突然想试试hash。。。代码量不到1k而且似乎竟然比写得不是很好的后缀数组快?自然溢出大法好...

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cstring>
 4 #include<algorithm>
 5 #define ui unsigned int
 6 using namespace std;
 7 const int maxn=100233;
 8 ui pre[maxn<<1],jc[maxn];
 9 int a[maxn];
10 char s[maxn<<1];
11 int i,j,k,n,m;
12
13 inline int smlen(int a,int b){
14     register int l=1,r=n,mid;a--,b--;
15     if(pre[a+r]-pre[a]*jc[n]==pre[b+r]-pre[b]*jc[n])return n;else r--;
16     while(l<r){
17         mid=(l+r+1)>>1;
18         if(pre[a+mid]-pre[a]*jc[mid]==pre[b+mid]-pre[b]*jc[mid])l=mid;else r=mid-1;
19     }
20     return l;
21 }
22 bool cmp(int a,int b){
23     if(s[a]!=s[b])return s[a]<s[b];
24     int x=smlen(a,b);
25     return x<n?s[a+x]<s[b+x]:0;
26 }
27
28 int main(){
29     scanf("%s",s);n=strlen(s),m=n<<1;
30     for(i=n;i;i--)s[i]=s[i-1];
31     for(i=n+1;i<=m;i++)s[i]=s[i-n];
32
33     for(i=1;i<=m;i++)pre[i]=pre[i-1]*(ui)259+(ui)s[i];
34     for(i=jc[0]=1;i<=n;i++)a[i]=i,jc[i]=jc[i-1]*(ui)259;
35     sort(a+1,a+1+n,cmp);
36     for(i=1;i<=n;i++)putchar(s[a[i]+n-1]);puts("");
37     return 0;
38 }

时间: 2024-10-12 21:48:44

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

[BZOJ1031][JSOI2007]字符加密Cipher 解题报告

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

[BZOJ1031] [JSOI2007] 字符加密Cipher (后缀数组)

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

[BZOJ1031][JSOI2007]字符加密Cipher(后缀数组)

传送门 算是个模板. 题目说循环,那就再复制一串拼接上. 然后求后缀数组,再搞就可以. 虽然是求后缀,会在后面多一些字符串,然而题目中说的是循环一圈,但是没有影响. ——代码 1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #define N 200005 5 6 int m = 'z' + 1; 7 int len, buc[N], x[N], y[N], sa[N]; 8 char s

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

bzoj1031[JSOI2007]字符加密

bzoj1031[JSOI2007]字符加密 题意: 一种加密办法是把需要加密的信息排成一圈,显然,它们有很多种不同的读法.把它们按照字符串的大小排序,读出最后一列字符,就是加密后的字符串.给出原字符串,求加密后的字符串. 题解: 将原字符串重复后接在后面,然后求后缀数组,注意求完后要取那些长度大于原字符串长度a2的后缀的第a2个字符. 代码: 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm>

【BZOJ-1031】字符加密Cipher 后缀数组

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

[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

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(后缀数组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