博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
后缀数组 --- WOj 1564 Problem 1564 - A - Circle
阅读量:5993 次
发布时间:2019-06-20

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

 Problem 1564 - A - Circle

Problem's Link:   http://acm.whu.edu.cn/land/problem/detail?problem_id=1564


 

Mean: 

给你一个长度不超过1e6的数字串,求第k大的环状数字串的前面那个位置。

 

analyse:

好吧,我承认这是个水题,比赛的时候sb了,因为原来做过后缀自动机求解字符串的环状最小表示法,所以一直用后缀自动机的知识去套k小表示法,比赛的时候太固执了。

这题就是后缀数组的sa[]数组的运用,sa[i]=k表示的是字符串所有的后缀按字典序排序后,第i个后缀排在第k个。

那么我们只需将数字串复制一遍接在原串后面(环状),对s求一遍后缀数字得到sa数组,然后找到sa<=n的第k个sa,那么sa[i]-1就是答案。

为什么?看这张图:

 

连接后的字符串我们可以得到2*n个字符串,但是我们只需关心前n个字符串就可,因为后面的n个字符串其实根本没作用,他们只相当于前n个字符串的前缀的重复出现而已。

所以我们只需要找到满足sa[i]<=n的第k个就行,sa[i]-1就是答案。

 

Time complexity: O(n)

 

Source code:  

 

//  Memory   Time//  1347K     0MS//   by : crazyacking//   2015-04-20-19.00#include#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define MAXN 1000010#define LL long longusing namespace std;const int maxn = 2002000;int Rank[maxn],wb[maxn],wv[maxn],wss[maxn];bool cmp(int *r,int a,int b,int l){ return r[a]==r[b] && r[a+l]==r[b+l];}void da(int *r,int *sa,int n,int m){ int i,j,p,*x=Rank,*y=wb,*t; for(i=0;i
=0;i--) sa[--wss[x[i]]]=i; for(j=1,p=1;p
=j) y[p++]=sa[i]-j; for(i=0;i
=0;i--) sa[--wss[wv[i]]]=y[i]; for(t=x,x=y,y=t,p=1,x[sa[0]]=0,i=1;i
View Code

 

#include
#include
#include
#define MAXN 1000010using namespace std;int n,k,len,si,now;char s[MAXN];vector
num;int GetAns(vector
tp,int tk,int l){ if(tp.size()==1 || l==n-1) return tp[0]; vector
cnt[10]; si=tp.size(); for(int i=0;i
cnt[now].size()) { tk-=cnt[now].size();now++; } return GetAns(cnt[now],tk,l+1);}int main(){ while(~scanf("%d %d",&n,&k)) { scanf("%s",s); len=strlen(s); num.clear(); for(int i=1;i<=len;++i) num.push_back(i); printf("%d\n",GetAns(num,k,0)); } return 0;}
View Code

 

转载于:https://www.cnblogs.com/crazyacking/p/4442386.html

你可能感兴趣的文章
BZOJ 3530: [Sdoi2014]数数 [AC自动机 数位DP]
查看>>
墨卡托投影、高斯-克吕格投影、UTM投影及我国分带方法
查看>>
Android中通过反射来设置Toast的显示时间
查看>>
Vysor Pro破解助手
查看>>
翻译Beginning iOS 7 Development中文版
查看>>
理顺FFT
查看>>
003-spring结合java类调用quartz
查看>>
Idea 常用功能汇总,工作中常用技巧,移出请说明原因,笔记花了好长时间汇总的...
查看>>
php给图片加入文字水印
查看>>
iOS开发-sqlite3使用
查看>>
(5)QlikView中的RowNo()函数
查看>>
SiteMesh2-示例工程
查看>>
poj 1087 A Plug for UNIX 【最大流】
查看>>
Phoenix与Squirrel 是什么?
查看>>
Photoshop制作的ico图标方法
查看>>
HDU 1241 Oil Deposits (DFS)
查看>>
【翻译自mos文章】注意: ASMB process exiting due to lack of ASM file activity
查看>>
Linux 线程浅析
查看>>
ucgui界面设计演示样例2
查看>>
蓝桥杯练习系统——基础练习 十六进制转十进制
查看>>