正题

题目链接:https://www.luogu.com.cn/problem/P4051


题目大意

给一个字符串,求它当每个环状字符串(比如ABCABCABC的就是ABC,CAB,BCAABC,CAB,BCAABC,CAB,BCA)排序后所有串的末尾连起来当字符串。


解题思路

这个其实就是每个串的后缀加上一部分前缀的排序,考虑如何加入每个串当前缀那一部分来排序,我们可以将原串复制一份放在后面并且每个串后面多出来当那一部分不会造成影响。
用SASASA排序即可。


codecodecode

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=2e5+10;
int n,m,x[N],y[N],sa[N],c[N];
char s[N];
void Qsort(){for(int i=1;i<=m;i++)c[i]=0;for(int i=1;i<=n;i++)c[x[i]]++;for(int i=1;i<=m;i++)c[i]+=c[i-1];for(int i=n;i>=1;i--)sa[c[x[y[i]]]--]=y[i],y[i]=0;
}
void SA(){m=2000;for(int i=1;i<=n;i++)x[i]=s[i],y[i]=i;Qsort();for(int w=1;w<=n;w<<=1){int p=0;for(int i=n-w+1;i<=n;i++)y[++p]=i;for(int i=1;i<=n;i++)if(sa[i]>w)y[++p]=sa[i]-w;Qsort();swap(x,y);x[sa[1]]=p=1;for(int i=2;i<=n;i++)x[sa[i]]=(y[sa[i]]==y[sa[i-1]]&&y[sa[i]+w]==y[sa[i-1]+w])?p:++p;if(p==n)break;m=p;}return;
}
int main()
{scanf("%s",s+1);n=strlen(s+1);for(int i=1;i<=n;i++)s[i+n]=s[i];n*=2;SA();for(int i=1;i<=n;i++)if(sa[i]<=n/2)printf("%c",s[sa[i]+n/2-1]);
}

P4051-[JSOI2007]字符加密【SA】相关推荐

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

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

  2. BZOJ1031: [JSOI2007]字符加密Cipher

    1031: [JSOI2007]字符加密Cipher Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 7882  Solved: 3425 [Subm ...

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

    为什么我的后缀数组跑得这么慢... 把字符串复制一遍放在最后, 然后跑sa, 扫一遍就行了... --------------------------------------------------- ...

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

    后缀数组主要功能: 长度为n的字符串总共有n个后缀,求这n个后缀的字典序 实现方法:倍增+基数排序,过程就是下面那张表 求log(n)次rank数组,每次的rank数组都可以通过上次的rank数组得出 ...

  5. [bzoj1031][JSOI2007]字符加密Cipher

    1031: [JSOI2007]字符加密Cipher Time Limit: 10 Sec Memory Limit: 162 MB Submit: 4175 Solved: 1694 [Submit ...

  6. 【洛谷 P4051】 [JSOI2007]字符加密(后缀数组)

    题目链接 两眼题.. 第一眼裸SA 第二眼要复制一倍再跑SA. 一遍过.. #include <cstdio> #include <cstring> #include < ...

  7. 【BZOJ】1031: [JSOI2007]字符加密Cipher(后缀数组)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1031 很容易想到这就是将字符串复制到自己末尾然后后缀数组搞出sa然后按区间输出即可. 然后换了下模板 ...

  8. [JSOI2007]字符加密

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

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

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

  10. bzoj 1031 [JSOI2007]字符加密Cipher 后缀数组

    题面 题目传送门 解法 后缀数组模板题吧-- 将字符串两倍,然后求一遍sa数组即可 时间复杂度:\(O(n\ log\ n)\) 代码 #include <bits/stdc++.h> # ...

最新文章

  1. html 右边框变短,HTML / CSS:使边框右侧高度动态化
  2. 代码质量第5层-只是实现了功能
  3. 修改科技论文的6项注意
  4. 你该认识这样的Linux_shell函数使用案例
  5. vcf文件(call variants得来的)怎么看变异是纯合还是杂合的
  6. Redis 通配符批量删除key
  7. c++ select函数_PySpark 操作函数一览
  8. minist _On_[GoogleNet]
  9. python+Django 完成第一个后端项目--创建投票应用(一)
  10. CentOS 6U7分区大于2TB的磁盘以及挂载大于16TB分区磁盘的解决方案
  11. 带你快速实现【C语言】之三子棋(简易版)
  12. 根据shp文件创建Mask文件
  13. dagger2简单使用与理解笔记
  14. 游戏感:虚拟感觉的游戏设计师指南——第十九章 游戏感的未来
  15. 敏捷开发 建立愿景、使命_敏捷产品计划:愿景,战略和策略
  16. 【MM采购定价】怎么样实现创建采购订单的时候,采购价格不可以更改?
  17. android 蓝牙相关的类,Android中BluetoothAdapter类简介
  18. 如何用java代码给Word文档添加水印?
  19. java代码去连接flash media server服务器_flash media server 第一课:Hello world!
  20. php CI 微信支付扩展 微信扫码支付 jssdk 支付 退款

热门文章

  1. go 切片取最后一个元素_深挖 Go 之 forrange 排坑指南
  2. python property setter_Python:动态属性 property setter 以及 __getattr__ 属性
  3. flask mysql项目模板渲染_21. Flask 模板 - 宏、继承、包含
  4. tensorflow打印模型图_从Tensorflow模型文件中解析并显示网络结构图(pb模型篇)...
  5. TypeScript,从0到入门带你进入类型的世界
  6. 图的建立-邻接表表示(C语言)
  7. [C++STL]C++实现string容器
  8. [蓝桥杯][算法提高VIP]扫雷-枚举
  9. Zookeeper--ZAB与Paxos算法联系与区别
  10. 数据结构---BF字符串模式匹配