Brief Description

给定一个数列,您每次可以把数列的最前面的数或最后面的数移动到新数列的开头,使得新数列字典序最小。输出这个新序列。

Algorithm Design

首先我们可以使用贪心得到一个\(O(n^2)\)的算法。

然后我们可以使用后缀数组把这个题目做成\(\Theta(nlogn)\)(倍增)或者\(\Theta(n)\)(DC3)

不过这个题目数据太水,第一种方法就可以水过了,简直坑。

Code

  1. #include <algorithm>
  2. #include <cstdio>
  3. const int maxn = 30010 << 1;
  4. int n, p, q, pp, qq, k;
  5. int v[maxn], a[maxn], sa[2][maxn], rank[2][maxn];
  6. void getsa(int sa[maxn], int rank[maxn], int Sa[maxn], int Rank[maxn]) {
  7. for (int i = 1; i <= n; i++)
  8. v[rank[sa[i]]] = i;
  9. for (int i = n; i >= 1; i--)
  10. if (sa[i] > k)
  11. Sa[v[rank[sa[i] - k]]--] = sa[i] - k;
  12. for (int i = n - k + 1; i <= n; i++)
  13. Sa[v[rank[i]]--] = i;
  14. for (int i = 1; i <= n; i++)
  15. Rank[Sa[i]] = Rank[Sa[i - 1]] + (rank[Sa[i - 1]] != rank[Sa[i]] ||
  16. rank[Sa[i - 1] + k] != rank[Sa[i] + k]);
  17. }
  18. void da() {
  19. p = 0, q = 1, k = 1;
  20. for (int i = 1; i <= n; i++)
  21. v[a[i]]++;
  22. for (int i = 1; i <= 26; i++)
  23. v[i] += v[i - 1];
  24. for (int i = 1; i <= n; i++)
  25. sa[p][v[a[i]]--] = i;
  26. for (int i = 1; i <= n; i++)
  27. rank[p][sa[p][i]] =
  28. rank[p][sa[p][i - 1]] + (a[sa[p][i]] != a[sa[p][i - 1]]);
  29. while (k < n) {
  30. getsa(sa[p], rank[p], sa[q], rank[q]);
  31. p ^= 1;
  32. q ^= 1;
  33. k <<= 1;
  34. }
  35. }
  36. void solve() {
  37. int l = 1, r = n >> 1, cnt = 0;
  38. while (l != r) {
  39. pp = a[l], qq = a[r];
  40. if (pp != qq) {
  41. if (pp < qq) {
  42. printf("%c", pp + 'A' - 1);
  43. l++;
  44. } else {
  45. printf("%c", qq + 'A' - 1);
  46. r--;
  47. }
  48. cnt++;
  49. } else {
  50. int r1 = rank[p][l], r2 = rank[p][n - r + 1];
  51. if (r1 < r2) {
  52. printf("%c", pp + 'A' - 1);
  53. l++;
  54. } else {
  55. printf("%c", qq + 'A' - 1);
  56. r--;
  57. }
  58. cnt++;
  59. }
  60. if (cnt == 80) {
  61. printf("\n");
  62. cnt = 0;
  63. }
  64. }
  65. printf("%c", a[l] + 'A' - 1);
  66. }
  67. int main() {
  68. #ifndef ONLINE_JUDGE
  69. freopen("input", "r", stdin);
  70. #endif
  71. scanf("%d", &n);
  72. for (int i = 1; i <= n; i++) {
  73. char ch[10];
  74. scanf("%s", ch);
  75. a[i] = ch[0] - 'A' + 1;
  76. a[n * 2 - i + 1] = a[i];
  77. }
  78. n <<= 1;
  79. da();
  80. solve();
  81. }

[bzoj1692][Usaco2007 Dec]队列变换——贪心+后缀数组的更多相关文章

  1. [bzoj1692][Usaco2007 Dec]队列变换_后缀数组_贪心

    队列变换 bzoj-1692 Usaco-2007 Dec 题目大意:给定一个长度为$n$的字符串.每次从头或尾取出一个字符加到另一个字符串里.要求变换后生成的字符串字典序最小,求字典序最小的字符串. ...

  2. 【bzoj1692】[Usaco2007 Dec]队列变换 贪心+后缀数组

    题目描述 FJ打算带他的N(1 <= N <= 30,000)头奶牛去参加一年一度的“全美农场主大奖赛”.在这场比赛中,每个参赛者都必须让他的奶牛排成一列,然后领她们从裁判席前依次走过. ...

  3. BZOJ_1692_[Usaco2007 Dec]队列变换_后缀数组

    BZOJ_1692_[Usaco2007 Dec]队列变换_后缀数组 Description FJ打算带他的N(1 <= N <= 30,000)头奶牛去参加一年一度的“全美农场主大奖赛” ...

  4. [BZOJ 1692] [Usaco2007 Dec] 队列变换 【后缀数组 + 贪心】

    ---恢复内容开始--- 题目链接:BZOJ - 1692 题目分析 首先,有个比较简单的贪心思路:如果当前剩余字符串的两端字母不同,就选取小的字母,这样显然是正确的. 然而若两端字母相同,我们怎么选 ...

  5. 【BZOJ】1692 & 1640: [Usaco2007 Dec]队列变换(后缀数组+贪心)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1692 http://www.lydsy.com/JudgeOnline/problem.php?id ...

  6. bzoj 1640||1692: [Usaco2007 Dec]队列变换【后缀数组】

    注意输出是80字符个一行!! 首先贪心很显然,就是两头尽量拿小的. 然后需要处理两头一样的情况,显然是选字典序小的一串,把数组反着接在原数组后面,然后跑sa,判断的时候直接比较rk数组 #includ ...

  7. bzoj1640[Usaco2007 Nov]Best Cow Line 队列变换*&&bzoj1692[Usaco2007 Dec]队列变换*

    bzoj1640[Usaco2007 Nov]Best Cow Line 队列变换 bzoj1692[Usaco2007 Dec]队列变换 题意: 有一个奶牛队列.每次可以在原来队列的首端或是尾端牵出 ...

  8. BZOJ1692: [Usaco2007 Dec]队列变换

    1692: [Usaco2007 Dec]队列变换 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 594  Solved: 246[Submit][Sta ...

  9. BZOJ 1692: [Usaco2007 Dec]队列变换( 贪心 )

    数据 n <= 30000 , 然后 O( n² ) 的贪心也过了..... USACO 数据是有多弱啊 = = ( ps : BZOJ 1640 和此题一模一样 , 双倍经验 ) ------ ...

随机推荐

  1. Ubuntu下使用Git_5

    还欠大家最后一篇Git的学习. Git的下一个内容,标签,标签是为了更方便的参考提交而给他表上通俗易懂的名称 Git可以使用两种标签,轻标签和注解标签,打上的标签是固定的,不能向分支那样可以移动位置, ...

  2. zabbix 2.2 调小监控值

    zabbix_agent默认disk下小于0%告警 调小到5% 组态 > 模板 选择需要的模板的触发器 例如 Template OS Windows 选择触发器 - 探索规则 - 触发器类型  ...

  3. Spark搭档Elasticsearch

    Spark与elasticsearch结合使用是一种常用的场景,小编在这里整理了一些Spark与ES结合使用的方法.一. write data to elasticsearch利用elasticsea ...

  4. hdu 1556 Color the ball (区间更新 求某点值)

    Problem Description N个气球排成一排,从左到右依次编号为1,2,3....N.每次给定2个整数a b(a <= b),lele便为骑上他的“小飞鸽"牌电动车从气球a ...

  5. 启动 SQL Server 管理 Studio 在 SQL Server 2008R2 中的错误消息:"无法读取此系统上以前注册的服务器的列表" 解决方法

    问题: 服务器被人直接停掉,重启后,发现sqlserver2008r2 启动管理器报错: "无法读取此系统上以前注册的服务器的列表" 如图: 点击继续,进入后: 解决方法: 点击上 ...

  6. AMF3 在Unity中使用AMF3和Java服务器通信

    现在在做的项目是一个网页游戏的移植到移动端. 所以服务器直接使用原来的代码.原来的游戏是as3实现,使用flash amf3数据通信. Unity 使用C#作为脚本语言,所以就需要.net的amf3解 ...

  7. 淘宝RubyGems和NPM镜像的使用

    题记:前不久在windows下配置jekyll环境时,需要用到gem,一个ruby的管理包,类似于管理nodejs包的npm.安装ruby环境后,使用gem安装包时请求国外的[https://ruby ...

  8. To Chromium之浏览器外框UI

    先不去管那些webkit,V8 engine, Parser, security,IPC... 先来看看Chromium的外框UI是那些code负责的,如果自己可以定制化一下,应该蛮好玩的. TBD. ...

  9. systemtap get var of the tracepoing

    kernel.trace("sched_switch") func:func:perf_trace_sched_stat_template get the function in ...

  10. calendar components

    calendar components 日历 angular, react, vue ??? react https://github.com/intljusticemission/react-big ...