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

保存后缀数组模版。

其实如果数据范围小一点,或者空间限制再大一点,或者甚至只要字母表再小一点就可以使用后缀自动机了,只可惜空间不允许,就用后缀数组!

其实还是不是很理解代码,是否该当成黑盒代码背下来呢?

#include <cstdio>
#include <cstring>
#include <algorithm> const int maxn = 200005; int n, mx, sa[maxn], t1[maxn], t2[maxn], c[maxn], *x, *y;
char s[maxn]; int main(void) {
scanf("%s", s);
n = strlen(s);
memcpy(s + n, s, n - 1);
n = (n << 1) - 1;
x = t1;
y = t2;
mx = 128; memset(c, 0, sizeof c);
for (int i = 0; i < n; ++i) {
++c[x[i] = s[i]];
}
for (int i = 1; i < mx; ++i) {
c[i] += c[i - 1];
}
for (int i = n - 1; ~i; --i) {
sa[--c[x[i]]] = i;
}
int p;
for (int k = 1; k <= n; k <<= 1) {
p = 0;
for (int i = n - k; i < n; ++i) {
y[p++] = i;
}
for (int i = 0; i < n; ++i) {
if (sa[i] >= k) {
y[p++] = sa[i] - k;
}
} memset(c, 0, sizeof c);
for (int i = 0; i < n; ++i) {
++c[x[y[i]]];
}
for (int i = 0; i < mx; ++i) {
c[i] += c[i - 1];
}
for (int i = n - 1; ~i; --i) {
sa[--c[x[y[i]]]] = y[i];
} std::swap(x, y);
p = 1;
x[sa[0]] = 0;
for (int i = 1; i < n; ++i) {
x[sa[i]] = y[sa[i - 1]] == y[sa[i]] && y[sa[i - 1] + k] == y[sa[i] + k]? p - 1: p++;
}
if (p >= n) {
break;
}
mx = p;
} int tem = (n + 1) >> 1;
for (int i = 0; i < n; ++i) {
if (sa[i] < tem) {
printf("%c", s[sa[i] + tem - 1]);
}
}
return 0;
}

  

_bzoj1031 [JSOI2007]字符加密Cipher【后缀数组】的更多相关文章

  1. BZOJ 1031 [JSOI2007]字符加密Cipher | 后缀数组模板题

    BZOJ 1031 [JSOI2007]字符加密Cipher | 后缀数组模板题 将字符串复制一遍接在原串后面,然后后缀排序即可. #include <cmath> #include &l ...

  2. 【BZOJ1031】[JSOI2007]字符加密Cipher 后缀数组

    [BZOJ1031][JSOI2007]字符加密Cipher Description 喜欢钻研问题的JS同学,最近又迷上了对加密方法的思考.一天,他突然想出了一种他认为是终极的加密办法 :把需要加密的 ...

  3. BZOJ 1031 [JSOI2007]字符加密Cipher 后缀数组教程

    1031: [JSOI2007]字符加密Cipher Description 喜欢钻研问题的JS同学,最近又迷上了对加密方法的思考.一天,他突然想出了一种他认为是终极的加密办法:把需要加密的信息排成一 ...

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

    1031: [JSOI2007]字符加密Cipher Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 6014  Solved: 2503[Submit ...

  5. 【BZOJ 1031】[JSOI2007]字符加密Cipher(后缀数组模板)

    [题目链接]:http://www.lydsy.com/JudgeOnline/problem.php?id=1031 [题意] [题解] 后缀数组模板题; 把整个字符串扩大一倍. 即长度乘2 然后搞 ...

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

    题目链接 题目描述 喜欢钻研问题的JS同学,最近又迷上了对加密方法的思考.一天,他突然想出了一种他认为是终极的加密办法 :把需要加密的信息排成一圈,显然,它们有很多种不同的读法.例如下图,可以读作: ...

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

    Description 喜欢钻研问题的JS同学,最近又迷上了对加密方法的思考.一天,他突然想出了一种他认为是终极的加密办法 :把需要加密的信息排成一圈,显然,它们有很多种不同的读法.例如下图,可以读作 ...

  8. [bzoj1031][JSOI2007]字符加密Cipher——后缀数组

    Brief Description 给定一个长度为n的字符串,你需要对其进行加密. 把字符串围成一个环 显然从任意一个位置开始都可以有一个长度为n的串 把产生的n个串按字典序排序,把这n个串的最后一个 ...

  9. BZOJ_1031_[JSOI2007]字符加密Cipher_后缀数组

    BZOJ_1031_[JSOI2007]字符加密Cipher_后缀数组 Description 喜欢钻研问题的JS同学,最近又迷上了对加密方法的思考.一天,他突然想出了一种他认为是终极的加密办法 :把 ...

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

    1031: [JSOI2007]字符加密Cipher Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 5504  Solved: 2277[Submit ...

随机推荐

  1. 使用Python实现一个简单的项目监控

    在公司里做的一个接口系统,主要是对接第三方的系统接口,所以,这个系统里会和很多其他公司的项目交互.随之而来一个很蛋疼的问题,这么多公司的接口,不同公司接口的稳定性差别很大,访问量大的时候,有的不怎么行 ...

  2. XMLHttpRequest对象解读

    <!DOCTYPE html> <html> <body> <script> function reqListener () { console.log ...

  3. Scala入门到精通——第十六节 泛型与注解

    本节主要内容 泛型(Generic Type)简单介绍 注解(Annotation)简单介绍 注解经常使用场景 1. 泛型(Generic Type)简单介绍 泛型用于指定方法或类能够接受随意类型參数 ...

  4. getifaddrs

    getifaddrs 获取本地网络接口的信息.在路由器上可以用这个接口来获取wan/lan等接口当前的ip地址,广播地址等信息. #include <sys/types.h> #inclu ...

  5. iOS 浅谈MVC设计模式及Controllers之间的传值方式

    1.简述你对MVC的理解? MVC是一种架构设计.它考虑了三种对象:Model(模型对象).View(试图对象).Controller(试图控制器) (1)模型:负责存储.定义.操作数据 (2)视图: ...

  6. 【iOS系列】-oc中的集合类

    OC中的集合有:NSArray 数组 NSDictionary 字典 NSSet 集合 第一:NSArrary 1.1:集合的基本方法 //1.创建集合 //NSArray 是不可变数组,一旦创建完成 ...

  7. 更改Mysql登录密码

    版本号49之前的跨域设置 在Windows命令行下修改mysql数据库密码步骤如下: 1.通过dos命令进入mysql的bin目录: 2.输入“mysql -uroot -p”,回车进入mysql命令 ...

  8. CSS 对齐方式

    居中设置 Center Align - Using margin Setting the width of a block-level element will prevent it from str ...

  9. HubbleDotNet开源全文搜索数据库项目--技术详解

    HubbleDotNet 简介 HubbleDotNet 和 Lucene.net 性能对比测试 HubbleDotNet 和 Lucene.Net 匹配相关度的比较 HubbleDotNet 软件架 ...

  10. APACHE2 服务器配置 (二) 默认端口***

    如将默认的80端口修改为9000 不管怎样,只要你选择合适的端口(电信商没有封的),进行如下的设置即可: 1, 修改 /etc/apache2/ports.conf 将 NameVirtualHost ...