LG4051/BZOJ1031 「JSOI2007」字符加密
时间:2019-09-06
本文章向大家介绍LG4051/BZOJ1031 「JSOI2007」字符加密,主要包括LG4051/BZOJ1031 「JSOI2007」字符加密使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
题解
发现这是一个环,根据经验,破环为链,于是字符环变为了字符串
之后对这个复制之后的字符串求后缀数组。
**$\mathrm{len}$代表原字符串长度,$\mathrm{n}$代表复制后的字符串长度**
最后输出的时候,判断一下,如果$SA_i \le len$,则输出$str_i$。
Code
1 #include<bits/stdc++.h> 2 using namespace std; 3 4 #define maxn 1000007 5 6 void read(int &x){ 7 x=0;char ch=1;int fh; 8 while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar(); 9 if(ch=='-') fh=-1,ch=getchar(); 10 else fh=1; 11 while(ch>='0'&&ch<='9'){ 12 x=(x<<1)+(x<<3)+ch-'0'; 13 ch=getchar(); 14 } 15 x*=fh; 16 } 17 18 char s[maxn]; 19 int n,m,sa[maxn],x[maxn],y[maxn],ct[maxn]; 20 21 int chk(int x){ 22 return x>0?x:x+n; 23 } 24 25 void SA(){ 26 for(register int i=1;i<=n;i++) ct[x[i]=s[i]]++; 27 for(register int i=2;i<=m;i++) ct[i]+=ct[i-1]; 28 for(register int i=n;i>=1;i--) sa[ct[x[i]]--]=i; 29 for(register int k=1;k<=n;k<<=1){ 30 int tot=0; 31 for(register int i=n-k+1;i<=n;i++) y[++tot]=i; 32 for(register int i=1;i<=n;i++) if(sa[i]>k) y[++tot]=sa[i]-k; 33 for(register int i=1;i<=m;i++) ct[i]=0; 34 for(register int i=1;i<=n;i++) ct[x[i]]++; 35 for(register int i=1;i<=m;i++) ct[i]+=ct[i-1]; 36 for(register int i=n;i>=1;i--) sa[ct[x[y[i]]]--]=y[i],y[i]=0; 37 swap(x,y);x[sa[1]]=tot=1; 38 for(register int i=2;i<=n;i++) 39 if(y[sa[i]]==y[sa[i-1]]&&y[sa[i]+k]==y[sa[i-1]+k]) x[sa[i]]=tot; 40 else x[sa[i]]=++tot; 41 if(tot==n) break; 42 m=tot; 43 } 44 } 45 46 int rnk[maxn]; 47 int let; 48 int main(){ 49 ios::sync_with_stdio(0); 50 cin>>(s+1);n=strlen(s+1);let=n; 51 for(register int i=n+1;i<=n*2;i++) s[i]=s[i-n]; 52 n*=2; 53 m=122;SA(); 54 for(register int i=1;i<=n;i++){ 55 rnk[sa[i]]=i; 56 } 57 for(register int i=1;i<=n;i++){ 58 if(sa[i]<=let) 59 cout<<s[sa[i]+let-1]; 60 } 61 cout<<endl; 62 return 0; 63 }
原文地址:https://www.cnblogs.com/liubainian/p/11478736.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- spring5新特性
- 进阶!MyBatis-Plus(基于 Springboot 演示)
- 运维人员常用的Linux命令总结
- Java反射机制的原理及在Android下的简单应用
- 温故而知新:MySQL存储引擎入门介绍
- 终于明白 Java 为什么要加 final 关键字了!
- 学习git这一篇就够了!!!
- 如何在nodejs中实现兄弟进程通信
- Python异常处理
- Python装饰器实现函数动态类型检查
- 如何自动填充SQL语句中的公共字段
- 面试官喜欢问的Java编译期与运行期问题总结全了
- 面试5年25K程序员回答不出来为什么Java的main方法必须是public static void?
- Python装饰器
- 3分钟短文:十年窖藏,Laravel告诉你表单验证的“正确姿势”