[bzoj1031][JSOI2007]字符加密Cipher——后缀数组
2024-09-07 08:01:27
Brief Description
给定一个长度为n的字符串,你需要对其进行加密。
- 把字符串围成一个环
- 显然从任意一个位置开始都可以有一个长度为n的串
- 把产生的n个串按字典序排序,把这n个串的最后一个字符顺接起来就得到了加密后的串。
Algorithm Design
看到环的题目,可以想到破环为链,我们把原串复制一份贴在后面,求这个串的SA,可以知道这个新串的SA扫一遍就得到了解。
然后这个题就做完了。
Code
#include <cstdio>
#include <cstring>
const int maxn = 200010;
char ch[maxn];
int a[maxn], n, k;
int v[maxn], sa[2][maxn], rank[2][maxn];
void init() {
scanf("%s", ch + 1);
n = strlen(ch + 1);
for (int i = 1; i <= n; i++) {
a[i] = (int)ch[i];
a[i + n] = a[i];
ch[i + n] = ch[i];
}
n <<= 1;
}
void calcsa(int sa[maxn], int rank[maxn], int SA[maxn], int RANK[maxn]) {
for (int i = 1; i <= n; i++)
v[rank[sa[i]]] = i;
for (int i = n; i >= 1; i--)
if (sa[i] > k)
SA[v[rank[sa[i] - k]]--] = sa[i] - k;
for (int i = n - k + 1; i <= n; i++)
SA[v[rank[i]]--] = i;
for (int i = 1; i <= n; i++) {
RANK[SA[i]] = RANK[SA[i - 1]] + (rank[SA[i - 1]] != rank[SA[i]] ||
rank[SA[i - 1] + k] != rank[SA[i] + k]);
}
}
void work() {
int p = 0, q = 1;
for (int i = 1; i <= n; i++)
v[a[i]]++;
for (int i = 1; i <= 256; i++)
v[i] += v[i - 1];
for (int i = 1; i <= n; i++)
sa[p][v[a[i]]--] = i;
for (int i = 1; i <= n; i++)
rank[p][sa[p][i]] =
rank[p][sa[p][i - 1]] + (a[sa[p][i]] != a[sa[p][i - 1]]);
k = 1;
while (k < n) {
calcsa(sa[p], rank[p], sa[q], rank[q]);
p ^= 1;
q ^= 1;
k <<= 1;
}
for (int i = 1; i <= n; i++) {
if (sa[p][i] <= n / 2)
printf("%c", ch[sa[p][i] + n / 2 - 1]);
}
printf("\n");
}
int main() {
#ifndef ONLINE_JUDGE
freopen("input", "r", stdin);
#endif
init();
work();
return 0;
}
最新文章
- 启动调试IIS时,vs无法在 Web 服务器上启动调试。Web 服务器未能找到请求的资源。 有关详细信息,请单击“帮助”。
- 中英文维基百科语料上的Word2Vec实验
- js做计算器
- Oracle子查询(嵌套查询)
- Opencv Cookbook阅读笔记(四):用直方图统计像素
- 251. Flatten 2D Vector
- mysql之sql语句细节问题汇总
- winform 窗体最大化 分类: WinForm 2014-07-17 15:57 215人阅读 评论(0) 收藏
- execlp函数使用
- js 、jq强化复习
- Net Core API网关Ocelot
- SqlServer卡慢解决办法
- 密码与安全新技术专题之AI与密码
- spring、springMVC、mybatis配置文件
- python while循环案例
- SharePoint 2010 自定义页面出现“项目可能已被其他用户删除或重命名”问题跟踪
- 利用Fiddler2和Proxifier分析你用的中国菜刀是否带有后门
- 用C++写程序的一些感悟
- java 矩阵转置算法
- k8s的储存方式简述