#P4051. L2-2
L2-2
题目描述
我们希望你能回忆起一个简单的算法。和我一样,这可能是你学习的第一个算法,叫做 "冒泡排序"。
void bubble_sort(int a[], int n) { // 0-based, sort from lowest to highest
for (int i = 1; i < n; i++) {
for (int j = 0; j < n - i; j++) {
if (a[j] > a[j + 1]) {
swap(a[j], a[j + 1]);
}
} // after i-th inner iteration, a[n - i] is correct
}
}
正如你可能知道的,给定一个长度为 的排列,在最坏的情况下,冒泡排序的运行时间为 。计算算法中调用swap
的次数是一个非常传统的想法。正如你现在所做的,你想在可能发生以下事件的动态排列中计算这个次数:
Reverse
:反向排列,即排列替换为
Shift
:将排列向左移动 ,即排列替换为
您所需要做的就是在每次操作后,输出如果我们使用上述泡排序代码对排列进行排序,所调用的 "交换 "次数。
输入格式
第一行包含两个整数 $n, m (1 \leq n \leq 1 \times 10 ^ 3, 1 \leq m \leq 6 \times 10 ^ 5)$ ,分别表示序列长度和操作次数。
第二行包含用空格分隔的个整数,其中 表示初始 。
第三行包含一个由 个字母组成的字符串,这些字母由 R
和 S
组成。
字母 -th表示 -th操作,其中R
或S
分别表示Reverse
或Shift
操作。
可以保证 构成 的正确排列。
输出格式
第一行,打印排序初始 时调用的 swap
次数。
在第二行中,打印一个由 个数字组成的字符串
-表示调用swap
来对当前序列进行排序的次数对取余数的结果
样例
5 10
5 4 3 2 1
SSSSRSSSSR
10
6446466400
Related
In following contests: