[POJ 3581]Sequence】的更多相关文章

[POJ 3581]Sequence 标签: 后缀数组 题目链接 题意 给你一串序列\(A_i\),保证对于$ \forall i \in [2,n],都有A_1 >A_i$. 现在需要把这个序列分成三段,并且将这三段分别翻转,求如何翻转使整个序列字典序最小.(每一段不能为空) 题解 首先可以确定第一段的位置. 注意到,\(A_1\)是最大的,所以我们就只用考虑怎样找到一个前缀使其翻转后的字典序最小. (假如不是的话,就可能找到两个前缀翻转之后,一个为另一个的前缀,无法解决) 这等价于翻转之后找…
[题目链接] http://poj.org/problem?id=3581 [题目大意] 给出一个数列,将这个数列分成三段,每段分别翻转,使得其字典序最小,输出翻转后的数列. [题解] 首先,第一个翻转点就是翻转后数列的最小后缀,注意由于一定要分成三段,则至少要剩下两个元素.难点主要是如何处理第二个翻转点,我们发现剩余的部分的每一种翻转拆分都是将两串翻转后剩余部分拼接在一起得到的串的子串,所以我们将剩余部分翻转,复制一份拼接在后面,求最小后缀即可. [代码] #include <cstdio>…
Sequence Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 6911   Accepted: 1543 Case Time Limit: 2000MS Description Given a sequence, {A1, A2, ..., An} which is guaranteed A1 > A2, ..., An,  you are to cut it into three sub-sequences and…
Description Given a sequence, {A1, A2, ..., An} which is guaranteed A1 > A2, ..., An,  you are to cut it into three sub-sequences and reverse them separately to form a new one which is the smallest possible sequence in alphabet order. The alphabet or…
题目链接 题意:把n个数字(A1比其他数字都大)的序列分成三段,每段分别反转,问字典序最小的序列. 分析:因为A1比其他数字都大,所以反转后第一段结尾是很大的数,相当是天然的分割线,第一段可以单独考虑,即求整段的字典序最小的后缀.后面两段不能分开考虑, 例子: 98 4 -1 5 0 5 0 2 3第一步:3 2 0 5 0 5 -1 4 8 对应输出 -1 4 8第二步3 2 0 5 0 5(开始的时候我并没有复制一遍) 对应输出:0 5第三步3 2 0 5    对应输出: 3 2 0 5可…
[题目分析] 一见到题目,就有了一个显而易见obviously的想法.只需要每次找到倒过来最小的那一个字符串翻转就可以了. 然而事情并不是这样的,比如说505023这样一个字符串,如果翻转了成为320505. 最小的后缀是05,那么得到的字符串是055023,然而最小的结果是全部翻转,为050523. 因为我们没有考虑到翻转后的字符和未翻转的字符有可能会连接起来,我们并没有考虑到连接部分对答案的影响. 这里我们用最小表示的方法来做这道题目,每次操作完成之后,都需要把翻转后的串复制两遍,这样的话,…
题意: 已知某字符串\(str\)满足\(str_1 > max\{str_2,str_3 \cdots str_n\}\),现要求把这个字符串分成连续的三组,然后每组都翻转,问字典序最小是什么? 思路: 因为\(str_1 > max\{str_2,str_3 \cdots str_n\}\),所以第一部分直接翻转后跑\(sa\)求字典序最小就行了.那么现在问题转化为:把这个字符串分成两半,然后每组都翻转,问字典序最小是什么? 我们假设这个字符串为\(s_1s_2 \cdots s_n\),…
题目链接 题意 给出n个数字的序列,现在让你分成三段,使得每一段翻转之后拼接起来的序列字典序最小.保证第一个数是序列中最大的数. 例如样例是{10, 1, 2, 3, 4},分成{1, 10}, {2}, {3,4},最后字符串变成{1, 10, 2, 4, 3}. 思路 首先考虑第一段,因为第一个数是最大的,因此只要使得某一个前缀翻转后的字典序最小,所以只要选择序列翻转后最小后缀. 对于第二段和第三段,如果像第一段一样直接找剩下的里面最小的后缀,是不可行的,因为直接取第二段最优就忽略了第三段的…
题意: 将一个序列分成非空的三部分,将每部分翻转后组合成一个新的序列, 输出这样操作得到的序列中字典序最小的序列 (保证第一个数是数组中最大的元素) 题解: 把数组当作串串. 因为第一个数最大,所以我们可以先将串反过来,然后可以找第一个sa[ i ] > 1 , 因为sa[ i ] 就是字典序从小到大排列的. 然后第二部分的处理就我是看题解的. 第二部分不能直接这样求解 例如: 除去第一部分之后的序列为 4 3 2 2  ,如果直接选取字典序最小的的串是 2 ,那么最后的解是 2  4 3 2…
Pro. 1 给定k个有序表,取其中前n小的数字.组成一个新表,求该表? 算法: 由于  a1[1] < a1[2] < a1[3] ... <a1[n] a2[1] < a2[2] < a2[3] ... < a2[n] ......... ak[1] < ak[2]<ak[3]...... < ak[n] 首先每个有序表的第一个元素入堆,然后最小元素出堆.该元素入新表L,相应线性表的下一个元素入堆. 例如:如果出堆得是a2[2],那么a2[3]入堆…