【BZOJ 1031】[JSOI2007]字符加密Cipher(后缀数组模板)
【题目链接】:http://www.lydsy.com/JudgeOnline/problem.php?id=1031
【题意】
【题解】
后缀数组模板题;
把整个字符串扩大一倍.
即长度乘2
然后搞出后缀数组;
然后顺序枚举i;
对于sa[i]< n的输出对应的s[sa[i]+n-1]就好了
后缀的含义是把后缀按照字典序从小到大排一下.
按照这个规则;
就能搞了;
必然是在前n个字符中就能比较出来;
所以及时后缀多了一些也没事.
【完整代码】
#include <bits/stdc++.h>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define LL long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define rei(x) scanf("%d",&x)
#define rel(x) scanf("%lld",&x)
#define ref(x) scanf("%lf",&x)
typedef pair<int, int> pii;
typedef pair<LL, LL> pll;
const int dx[9] = { 0,1,-1,0,0,-1,-1,1,1 };
const int dy[9] = { 0,0,0,-1,1,-1,1,-1,1 };
const double pi = acos(-1.0);
const int N = 1e5+100;
char s[N * 2];
int sa[N * 2], wv[2][350005], tong[N * 2];
bool cmp(int *tmp, int x, int y, int j)
{
return tmp[x] == tmp[y] && tmp[x + j] == tmp[y + j];
}
void getsa(int n, int m)
{
int p = 0, *x = wv[0], *y = wv[1];
rep1(i, 0, n - 1)
++tong[x[i] = s[i]];
rep1(i, 1, m - 1)
tong[i] += tong[i - 1];
rep2(i, n - 1, 0)
sa[--tong[x[i]]] = i;
for (int j = 1; p != n; j <<= 1, m = p)
{
p = 0;
rep1(i,n-j,n-1)
y[p++] = i;
rep1(i, 0, n - 1)
if (sa[i] >= j)
y[p++] = sa[i] - j;
rep1(i, 0, m - 1)
tong[i] = 0;
rep1(i, 0, n - 1)
++tong[x[y[i]]];
rep1(i, 1, m - 1)
tong[i] += tong[i - 1];
rep2(i, n - 1, 0)
sa[--tong[x[y[i]]]] = y[i];
swap(x, y), p = 1, x[sa[0]] = 0;
rep1(i, 1, n - 1)
x[sa[i]] = cmp(y, sa[i - 1], sa[i], j) ? p - 1 : p++;
}
}
int main()
{
//freopen("F:\\rush.txt", "r", stdin);
int n;
scanf("%s", s);
n = strlen(s);
rep1(i, 0, n - 1)
s[i + n] = s[i];
getsa(n << 1 | 1, 128);
rep1(i, 1, n << 1)
if (sa[i] < n)
putchar(s[sa[i] + n - 1]);
puts("");
//printf("\n%.2lf sec \n", (double)clock() / CLOCKS_PER_SEC);
return 0;
}
【BZOJ 1031】[JSOI2007]字符加密Cipher(后缀数组模板)的更多相关文章
- BZOJ 1031 [JSOI2007]字符加密Cipher | 后缀数组模板题
BZOJ 1031 [JSOI2007]字符加密Cipher | 后缀数组模板题 将字符串复制一遍接在原串后面,然后后缀排序即可. #include <cmath> #include &l ...
- bzoj 1031 [JSOI2007]字符加密Cipher 后缀数组模板
题目链接 题目描述 喜欢钻研问题的JS同学,最近又迷上了对加密方法的思考.一天,他突然想出了一种他认为是终极的加密办法 :把需要加密的信息排成一圈,显然,它们有很多种不同的读法.例如下图,可以读作: ...
- BZOJ 1031 [JSOI2007]字符加密Cipher 后缀数组教程
1031: [JSOI2007]字符加密Cipher Description 喜欢钻研问题的JS同学,最近又迷上了对加密方法的思考.一天,他突然想出了一种他认为是终极的加密办法:把需要加密的信息排成一 ...
- BZOJ 1031: [JSOI2007]字符加密Cipher 后缀数组
1031: [JSOI2007]字符加密Cipher Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 6014 Solved: 2503[Submit ...
- bzoj 1031: [JSOI2007]字符加密Cipher 後綴數組模板題
1031: [JSOI2007]字符加密Cipher Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3157 Solved: 1233[Submit ...
- 【BZOJ1031】[JSOI2007]字符加密Cipher 后缀数组
[BZOJ1031][JSOI2007]字符加密Cipher Description 喜欢钻研问题的JS同学,最近又迷上了对加密方法的思考.一天,他突然想出了一种他认为是终极的加密办法 :把需要加密的 ...
- 1031. [JSOI2007]字符加密【后缀数组】
Description 喜欢钻研问题的JS同学,最近又迷上了对加密方法的思考.一天,他突然想出了一种他认为是终极的加密办法 :把需要加密的信息排成一圈,显然,它们有很多种不同的读法.例如下图,可以读作 ...
- bzoj 1031 [JSOI2007]字符加密Cipher
求出来后缀数组的rank就行了,不会可以去看集训队论文. #include<iostream> #include<cstdio> #include<cstring> ...
- bzoj 1031: [JSOI2007]字符加密Cipher【后缀数组】
算是SA的裸题了 把串复制一遍接在原串后面,然后求SA,然后按着SA的顺序输出尾字符即可 #include<iostream> #include<cstdio> #includ ...
随机推荐
- jQuery的实现原理和核心
1.jQuery的实现原理 1)jQuery采用的是构造函数模式进行开发的,jQuery是一个类 2)上面说的常用的方法(CSS.属性.筛选.事件.动画.文档处理)都是定义在jQuery.protot ...
- 3.Docker安装【Docker每天5分钟】
原文:3.Docker安装[Docker每天5分钟] Docker给PaaS世界带来的“降维打击”,其实是提供了一种非常便利的打包机制.该机制打包了应用运行所需要的整个操作系统,从而保证了本地环境和云 ...
- Dynamic device virtualization
A system and method for providing dynamic device virtualization is herein disclosed. According to on ...
- amazeui页面分析2
amazeui页面分析2 一.总结 1.弄清结构:这些部分都是一块一块分好了的,掌握结构之后,想替换哪块就替换哪块,想不要哪块就不要哪块,非常简单的 2.一块一块:替换十分简单 3.弄清楚大块之后,然 ...
- C#中lock
http://www.cnblogs.com/apsnet/archive/2012/07/08/2581475.html
- 2、应用程序及驱动-poll和select使用说明
1.poll机制(如果中断机制出问题了,poll机制是对中断机制的补充,比如等一个小孩,如果小孩生病了,因此隔一段时间应该去找他) poll机制就是给定一段时间,在这一段时间内程序处于睡眠状态一直等待 ...
- 总览:SpringCloud基础结构
客户端: 1.连接 配置中心2.连接 服务中心3.连接 链路跟踪3.feign调用4.熔断机制5.连接 熔断监控6.swagger2 生成的RESTful-API7.消息总线-rabbitMQ实现 基 ...
- Linux环境编程之共享内存区(一):共享内存区简单介绍
共享内存区是可用IPC形式中最快的.一旦内存区映射到共享它的进程的地址空间,进程间数据的传递就不再涉及内核.然而往该共享内存区存放信息或从中取走信息的进程间通常须要某种形式的同步.不再涉及内核是指:进 ...
- PostgreSQL 序列
PostgreSQL 中的序列是一个数据库对象,本质上是一个自增器.因此,序列在其他同类型数据库软件中以 autoincrment 值的形式存在.在一张表需要非随机,唯一标实符的场景下,Sequenc ...
- C#无符号右移
/// <summary> /// 无符号右移,与JS中的>>>等价 /// </summary> /// & ...