Brief Description

给定一个长度为n的字符串,你需要对其进行加密。

  1. 把字符串围成一个环
  2. 显然从任意一个位置开始都可以有一个长度为n的串
  3. 把产生的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;
}

最新文章

  1. 启动调试IIS时,vs无法在 Web 服务器上启动调试。Web 服务器未能找到请求的资源。 有关详细信息,请单击“帮助”。
  2. 中英文维基百科语料上的Word2Vec实验
  3. js做计算器
  4. Oracle子查询(嵌套查询)
  5. Opencv Cookbook阅读笔记(四):用直方图统计像素
  6. 251. Flatten 2D Vector
  7. mysql之sql语句细节问题汇总
  8. winform 窗体最大化 分类: WinForm 2014-07-17 15:57 215人阅读 评论(0) 收藏
  9. execlp函数使用
  10. js 、jq强化复习
  11. Net Core API网关Ocelot
  12. SqlServer卡慢解决办法
  13. 密码与安全新技术专题之AI与密码
  14. spring、springMVC、mybatis配置文件
  15. python while循环案例
  16. SharePoint 2010 自定义页面出现“项目可能已被其他用户删除或重命名”问题跟踪
  17. 利用Fiddler2和Proxifier分析你用的中国菜刀是否带有后门
  18. 用C++写程序的一些感悟
  19. java 矩阵转置算法
  20. k8s的储存方式简述

热门文章

  1. vuex模块相互调用
  2. Vm-Ubuntu下配置Qt开发环境
  3. ADB常用指令
  4. Spring Boot 学习随记
  5. C语言关于“输入包含多行数据,请处理到文件结束”的问题
  6. HDU 4467 Graph(图论+暴力)(2012 Asia Chengdu Regional Contest)
  7. POJ 2168 Joke with Turtles(DP)
  8. java正则表达式2 -- 匹配、切割、查找
  9. lintcode-103-带环链表 II
  10. HDU 2139 Calculate the formula