博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
bzoj1031: [JSOI2007]字符加密Cipher
阅读量:5243 次
发布时间:2019-06-14

本文共 1086 字,大约阅读时间需要 3 分钟。

传送门:

思路:非常水的后缀数组,把串复制一遍到后面,后缀排序即可。

#include
#include
#include
const int maxn=200010;using namespace std;int n,t1[maxn],t2[maxn],sa[maxn],rank[maxn],sum[maxn],cnt;char s[maxn];void getsa(){ int *x=t1,*y=t2,m=255,p=0; for (int i=1;i<=n;i++) sum[x[i]=s[i]]++; for (int i=1;i<=m;i++) sum[i]+=sum[i-1]; for (int i=n;i;i--) sa[sum[x[i]]--]=i; for (int j=1;p
<<=1,m=p){ p=0; for (int i=n-j+1;i<=n;i++) y[++p]=i; for (int i=1;i<=n;i++) if (sa[i]>j) y[++p]=sa[i]-j; memset(sum,0,sizeof(sum)); for (int i=1;i<=n;i++) sum[x[y[i]]]++; for (int i=1;i<=m;i++) sum[i]+=sum[i-1]; for (int i=n;i;i--) sa[sum[x[y[i]]]--]=y[i]; swap(x,y),x[sa[1]]=p=1; for (int i=2;i<=n;i++){ if (y[sa[i]]!=y[sa[i-1]]||y[sa[i]+j]!=y[sa[i-1]+j]) p++; x[sa[i]]=p; } } memcpy(rank,x,sizeof(rank));}int main(){ scanf("%s",s+1),n=strlen(s+1); for (int i=1;i<=n;i++) s[i+n]=s[i]; s[(n=n*2)+1]='\0',getsa(),n/=2; for (int i=1;i<=n*2;i++) if (sa[i]<=n) putchar(s[sa[i]+n-1]); puts(""); return 0;}

转载于:https://www.cnblogs.com/thythy/p/5493537.html

你可能感兴趣的文章
桥接模式-Bridge(Java实现)
查看>>
303. Range Sum Query - Immutable
查看>>
【★】浅谈计算机与随机数
查看>>
Leetcode 226: Invert Binary Tree
查看>>
C# Dynamic通用反序列化Json类型并遍历属性比较
查看>>
前台freemark获取后台的值
查看>>
Leetcode: Unique Binary Search Trees II
查看>>
C++ FFLIB 之FFDB: 使用 Mysql&Sqlite 实现CRUD
查看>>
Spring-hibernate整合
查看>>
c++ map
查看>>
exit和return的区别
查看>>
Django 相关
查看>>
git init
查看>>
训练记录
查看>>
IList和DataSet性能差别 转自 http://blog.csdn.net/ilovemsdn/article/details/2954335
查看>>
Hive教程(1)
查看>>
第16周总结
查看>>
C#编程时应注意的性能处理
查看>>
比较安全的获取站点更目录
查看>>
苹果开发者账号那些事儿(二)
查看>>