Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
解题报告题目大意,给定一个数列,第一项比其他任何项都要大,要求分成三份,不能为空,分成三份后,再翻转,求最小的序列 题中给出了最小的定义 咋一看完全没有想法,手算了下样例,猜测第一个切点很可能与最小后缀有关,后来想想这其实是贪心的一部,由于涉及翻转,先将整个字符串倒序输入,求一次后缀,然后找出最小的那个,注意要保持能分成三份,显然第一个切点必定是最小的那个点的sa值,为什么呢,这样在最大项之前,我们可以保证前面的是所有情况中字典序最小的,安顿好了最大的项及其前面最小的字典序,我们再来看第二个切点,是否可以任然按照上面的呢,假定此时的串为 [0,t]我们找到一个切点k,得到两个串 s1,s2,[0,k], [k+1,t],第一部分已经输出,如何保证第二部分的最小呢,我们不能直接的从当前串的后缀中入手,因为可能当前s2很小,但是s1前面有很大的数字,而s1 后面有很小的数字,那么是会影响到最终的结果的,在这里我猜啊猜,用了10多次的wa,找到了一些规律,将剩下的串,切割成两个,把s2放前,s1放后,这个不需要解释了把,使得新生成的串(最小):猛然想到昨天看的最小表示法:这不就是是最小表示么,我们要找的那个点就是使得新构成的串最小,这里我们可以复制一下剩余串,接上,这样子就很好的解决了循环的问题,那么在这个新串上找到的最小后缀一定是符合要求的, Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator