[BZOJ1031][JSOI2007]字符加密Cipher(后缀数组)
2016-04-17 18:46
549 查看
题目描述
传送门题解
把环展成链,利用后缀数组的性质求出后缀按照字典序的排名,最后判断一下是否满足条件并输出。代码
#include<iostream> #include<cstring> #include<cstdio> using namespace std; const int max_n=5e5+5; int n,m=300; char s[max_n]; int sa[max_n],c[max_n],x[max_n],y[max_n]; inline void build_sa(){ for (int i=0;i<m;++i) c[i]=0; for (int i=0;i<n;++i) c[x[i]=s[i]]++; for (int i=1;i<m;++i) c[i]+=c[i-1]; for (int i=n-1;i>=0;--i) sa[--c[x[i]]]=i; for (int k=1;k<=n;k<<=1){ int p=0; for (int i=n-k;i<n;++i) y[p++]=i; for (int i=0;i<n;++i) if (sa[i]>=k) y[p++]=sa[i]-k; for (int i=0;i<m;++i) c[i]=0; for (int i=0;i<n;++i) c[x[y[i]]]++; for (int i=1;i<m;++i) c[i]+=c[i-1]; for (int i=n-1;i>=0;--i) sa[--c[x[y[i]]]]=y[i]; swap(x,y); p=1; x[sa[0]]=0; for (int i=1;i<n;++i) x[sa[i]]=y[sa[i-1]]==y[sa[i]]&& ((sa[i-1]+k>=n?-1:y[sa[i-1]+k])==(sa[i]+k>=n?-1:y[sa[i]+k]))?p-1:p++; if (p>n) break; m=p; } } int main(){ gets(s); n=strlen(s); for (int i=0;i<n;++i) s[n+i]=s[i]; n*=2; build_sa(); for (int i=0;i<n;++i) if (sa[i]<n/2) putchar(s[sa[i]+n/2-1]); putchar('\n'); }
总结
不要越界相关文章推荐
- javascript 前端学习经验总结
- xml与json的对比
- Jsp的四大域对象
- js---匿名函数和闭包
- PhantomJS
- 《Javascript秘密花园》学习笔记(中)
- HTML&CSS—— javascript (function(){})()闭包
- 半卷湘帘半掩门,碾冰为土玉为盆——客户端检测
- JSON
- Json实际项目中应用
- bzoj 1031: [JSOI2007]字符加密Cipher
- 重识Javascript系列---ECMAScript变量
- js中时间问题
- [RxJS] Creation operator: create()
- JSP 九个隐含JSP对象
- javascript第六天
- jsp页面跳转
- [RxJS] Creation operators: interval and timer
- Learning Scrapy笔记(六)- Scrapy处理JSON API和AJAX页面
- javascript中textContent与innerText的异同分析