bzoj 1031

复制一下原串处理环,然后直接出SA就可以了

 1 #include<bits/stdc++.h>
 2 #define inc(i,l,r) for(int i=l;i<=r;i++)
 3 #define dec(i,l,r) for(int i=l;i>=r;i--)
 4 #define link(x) for(edge *j=h[x];j;j=j->next)
 5 #define mem(a) memset(a,0,sizeof(a))
 6 #define inf 1e9
 7 #define ll long long
 8 #define succ(x) (1<<x)
 9 #define NM 200000+5
10 using namespace std;
11 int read(){
12     int x=0,f=1;char ch=getchar();
13     while(!isdigit(ch)){if(ch==‘-‘)f=-1;ch=getchar();}
14     while(isdigit(ch))x=x*10+ch-‘0‘,ch=getchar();
15     return x*f;
16 }
17 char st[NM];
18 int top[NM],rank[NM],sa[NM],tmp[NM],n,t,m;
19 void getsa(){
20     int j;m=256;
21     inc(i,0,n)top[rank[i]=(int)st[i]]++;
22     inc(i,1,m)top[i]+=top[i-1];
23     inc(i,0,n)sa[--top[rank[i]]]=i;
24 //    inc(i,0,n)printf("%d ",sa[i]);printf("\n");
25     for(int k=1;k<=n;k<<=1){
26         inc(i,0,n){
27             j=sa[i]-k;
28             if(j<0)j+=n+1;
29             tmp[top[rank[j]]++]=j;
30         }
31         sa[tmp[top[0]=0]]=j=0;
32 //        inc(i,0,n)printf("%d ",tmp[i]);printf("\n");
33         inc(i,0,n){
34             if(rank[tmp[i]]!=rank[tmp[i-1]]||rank[tmp[i]+k]!=rank[tmp[i-1]+k])
35             top[++j]=i;
36             sa[tmp[i]]=j;
37         }
38         memcpy(rank,sa,sizeof(sa));
39         memcpy(sa,tmp,sizeof(tmp));
40         if(j>=n)break;
41     }
42 }
43 int main(){
44     freopen("data.in","r",stdin);
45     scanf("%s",st);
46     t=strlen(st);
47     inc(i,0,t-1)st[i+t]=st[i];
48     n=strlen(st)-1;
49     getsa();
50     inc(i,0,n)
51     if(sa[i]<t)
52     printf("%c",st[sa[i]+t-1]);
53     printf("\n");
54     return 0;
55 }

时间: 2024-10-22 09:24:48

bzoj 1031的相关文章

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 字符加密

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

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

字符加密Cipher(bzoj 1031)

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

【BZOJ 1031】[JSOI2007]字符加密Cipher

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

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[20000

BZOJ 1031 JSOI 2007 字符加密Cipher 后缀数组

题目大意:给出一个字符串,循环字符串的起始位置,可以得到length个不同的字符串,问把这些字符串排序之后每一个字符串的第一位是什么. 思路:后缀数组裸题,只需要将整个字符串倍增,然后求一次sa. CODE: #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define MAX 200010 using namespace std; char s[M

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

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

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