lexicographical order
时间: 2023-05-02 15:01:25 浏览: 93
"lexicographical order" 的中文意思是 "字典顺序" 或 "字典排序"。这是一种基于字母顺序的排序方法,按照字母表中的顺序排列字符或字符串。在计算机科学中,它通常用于排序字符串、日期和数字等数据类型。
相关问题
Problem Statement You are given a permutation A=(A 1 ,A 2 ,…,A N ) of (1,2,…,N). For a pair of integers (L,R) such that 1≤L≤R≤N, let f(L,R) be the permutation obtained by reversing the L-th through R-th elements of A, that is, replacing A L ,A L+1 ,…,A R−1 ,A R with A R ,A R−1 ,…,A L+1 ,A L simultaneously. There are 2 N(N+1) ways to choose (L,R) such that 1≤L≤R≤N. If the permutations f(L,R) for all such pairs (L,R) are listed and sorted in lexicographical order, what is the K-th permutation from the front? What is lexicographical order on sequences? A sequence S=(S 1 ,S 2 ,…,S ∣S∣ ) is said to be lexicographically smaller than a sequence T=(T 1 ,T 2 ,…,T ∣T∣ ) if and only if 1. or 2. below holds. Here, ∣S∣ and ∣T∣ denote the lengths of S and T, respectively. ∣S∣<∣T∣ and (S 1 ,S 2 ,…,S ∣S∣ )=(T 1 ,T 2 ,…,T ∣S∣ ). There is an integer 1≤i≤min{∣S∣,∣T∣} that satisfies both of the following. (S 1 ,S 2 ,…,S i−1 )=(T 1 ,T 2 ,…,T i−1 ). S i is smaller than T i (as a number).
题意概述:给定一个长度为 $N$ 的排列 $A$,对于所有的 $1\leq L\leq R\leq N$,将 $A_L,A_{L+1},\cdots,A_R$ 进行翻转得到一个新的排列 $f(L,R)$,将所有这样的排列按字典序排序,求第 $K$ 个排列。其中字典序定义为:对于两个序列 $S$ 和 $T$,如果 $S$ 是 $T$ 的前缀,且 $S$ 和 $T$ 在第一个不同的位置上的数的大小关系,那么 $S$ 和 $T$ 的字典序关系就确定了。
这个题目需要使用一些排列组合的知识和思想。我们先来考虑一下如何计算出 $f(L,R)$。对于一个排列 $A$,我们可以将其分成三个部分:
$$A=a_1a_2\cdots a_{L-1}a_La_{L+1}\cdots a_{R-1}a_Ra_{R+1}\cdots a_N$$
我们将 $a_L,a_{L+1},\cdots,a_R$ 进行翻转,得到的排列为:
$$f(L,R)=a_1a_2\cdots a_{L-1}a_Ra_{R-1}\cdots a_{L+1}a_La_{R+1}\cdots a_N$$
我们发现,如果我们枚举 $R$,那么 $L$ 的范围就是 $[1,R]$,也就是说,我们可以枚举 $R$,然后对于每个 $R$,枚举 $L$,计算出 $f(L,R)$,这样就能得到所有的排列 $f(L,R)$。
接下来,我们考虑如何计算第 $K$ 个排列。我们可以先计算出所有排列 $f(L,R)$,然后将其排序,最后取第 $K$ 个即可。但是这个做法的时间复杂度是 $O(N^3\log N)$,不太能通过本题。
我们可以换一种思路,考虑如何对于一个排列 $f(L,R)$,计算出它是第几个排列。假设 $f(L,R)$ 在所有排列中的位置为 $pos$,我们可以通过计算 $pos$ 来确定第 $K$ 个排列。
我们将 $f(L,R)$ 和 $A$ 比较,可以发现,$f(L,R)$ 和 $A$ 在前 $L-1$ 个位置上是相同的,而 $f(L,R)$ 和 $A$ 在 $L$ 到 $R$ 位置的相对位置关系是相反的。也就是说,如果 $f(L,R)$ 中的第 $i$ 个数是 $a_p$,那么 $A$ 中的第 $i$ 个数就是 $a_{L+R-p-i}$。
我们可以发现,对于所有的 $R$,$f(L,R)$ 和 $f(L,R+1)$ 只有第 $L$ 到 $R$ 个数的相对位置关系不同,其他位置都是相同的。也就是说,如果我们知道了 $f(L,R)$ 在所有排列中的位置 $pos_{L,R}$,那么对于 $f(L,R+1)$,它在所有排列中的位置就是 $pos_{L,R}+\Delta$,其中 $\Delta$ 表示 $f(L,R)$ 和 $f(L,R+1)$ 的第 $L$ 到 $R$ 个数的相对位置关系不同的个数。我们可以将 $\Delta$ 看做一个序列的逆序对数,然后通过归并排序的思想,计算出 $\Delta$ 的值。
对于计算 $pos_{L,R}$,我们可以使用类似康托展开的方法,计算出前面有多少个排列是以 $f(L,R)$ 开头的。具体地,我们可以计算出 $f(L,R)$ 中有多少个数比 $a_L$ 小,然后乘上 $(N-R+1)!$,再加上 $f(L,R)$ 除去第一个数以外的部分的排列的个数,即 $pos_{L+1,R}$。这样就可以递归计算出 $pos_{L,R}$ 了。
最终的时间复杂度为 $O(N^2\log N)$,可以通过本题。
用c++解决下述问题:描述 Some words have power. It can make a string containing it become more powerful (larger weight). The weight of a word in a string is defined as the number of its occurences in the string multiplied by its value, while the weight of the string is defined as the sum of all words' weights. Given some words with their values, you should output the string consisting of these words which make the string's weight maximal. 输入 The input consists of multiple test cases. The first line of the input is an integer T, indicating the number of the test cases. Each test case starts with a line consisting of two integers: N and M, indicating the string's maximum length and the number of the words. Each of the following M lines consists of a word Wi. The last line of each test case consists of M integers, while the i-th number indicates the value Vi of Wi. Technical Specification: 1. T ≤ 15 2. 0 < N ≤ 50, 0 < M ≤ 100. 3. The length of each word is less than 11 and bigger than 0. 4. 1 ≤ Vi ≤ 100. 5. All the words in the input are different. 6. All the words just consist of 'a' - 'z'. 输出 For each test case, output the string which has the maximal weight in a single line.If there are multiple answers, output the shortest one. If there are still multiple answers, output the smallest one in lexicographical order. The answer may be an empty string.
这道题需要使用动态规划来解决。我们可以定义dp[i]表示长度为i的字符串的最大权值,它可以通过枚举最后一个单词得到。具体地,我们枚举最后一个单词为Wi,那么dp[i]就可以由dp[i-len(Wi)] + Vi得到,其中len(Wi)表示单词Wi的长度,Vi表示单词Wi的权值。最后我们在dp数组中找到最大权值的位置,然后倒推出字符串即可。
代码如下:
阅读全文