2882: 工艺

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 599  Solved: 268
[Submit][Status][Discuss]

Description

  小敏和小燕是一对好朋友。
他们正在玩一种神奇的游戏,叫Minecraft。
他们现在要做一个由方块构成的长条工艺品。但是方块现在是乱的,而且由于机器的要求,他们只能做到把这个工艺品最左边的方块放到最右边。
他们想,在仅这一个操作下,最漂亮的工艺品能多漂亮。
两个工艺品美观的比较方法是,从头开始比较,如果第i个位置上方块不一样那么谁的瑕疵度小,那么谁就更漂亮,如果一样那么继续比较第i+1个方块。如果全都一样,那么这两个工艺品就一样漂亮。

Input

第一行两个整数n,代表方块的数目。
第二行n个整数,每个整数按从左到右的顺序输出方块瑕疵度的值。

Output

一行n个整数,代表最美观工艺品从左到右瑕疵度的值。

Sample Input

10
10 9 8 7 6 5 4 3 2 1

Sample Output

1 10 9 8 7 6 5 4 3 2

HINT

【数据规模与约定】

对于20%的数据,n<=1000

对于40%的数据,n<=10000

对于100%的数据,n<=300000

Source

[Submit][Status][Discuss]

求一串数字循环重构后能形成的的最小字典序串。

练习后缀自动机的时候从PoPoQQQ前辈那里看到了这道题,虽然貌似用最小表示法做更合适,但是后缀自动机也可以切。

因为最终不一定(几乎是肯定不会)从一开始给出时的第一个字符开始,为了方便地处理循环问题,我们先将这个串加倍,准确地讲是把1...n-1连接到原串的后面。这样,这个加倍后的串中任意一段长度为n的子串,都是原串的一个合法的循环重构串,我们只需要找到最小的一个长度为n的子串即可,那就后缀自动机喽。

  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. const int maxn = 6e5 + ;
  6.  
  7. #define it map<int, node*>::iterator
  8.  
  9. /* MYSCANNER */
  10.  
  11. const int siz = ;
  12.  
  13. inline int get_c(void)
  14. {
  15. static char buf[siz];
  16. static char *head = buf + siz;
  17. static char *tail = buf + siz;
  18.  
  19. if (head == tail)
  20. fread(head = buf, , siz, stdin);
  21.  
  22. return *head++;
  23. }
  24.  
  25. inline int get_i(void)
  26. {
  27. register int ret = ;
  28. register int neg = false;
  29. register int bit = get_c();
  30.  
  31. for (; bit < ; bit = get_c())
  32. if (bit == '-')neg ^= true;
  33.  
  34. for (; bit > ; bit = get_c())
  35. ret = ret* + bit - '';
  36.  
  37. return neg ? -ret : ret;
  38. }
  39.  
  40. /* AUTOMATON */
  41.  
  42. struct node
  43. {
  44. int step;
  45. node *fail;
  46. map<int, node*> next;
  47. node(void)
  48. {
  49. step = ;
  50. fail = NULL;
  51. next.clear();
  52. }
  53. }*root, *last;
  54.  
  55. inline void build(void)
  56. {
  57. root = last = new node;
  58. }
  59.  
  60. inline void extend(int c)
  61. {
  62. node *p = last;
  63. node *t = new node;
  64. t->step = p->step + ;
  65. while (p && !p->next[c])
  66. p->next[c] = t, p = p->fail;
  67. if (p)
  68. {
  69. node *q = p->next[c];
  70. if (q->step == p->step + )
  71. t->fail = q;
  72. else
  73. {
  74. node *k = new node;
  75. k->fail = q->fail;
  76. k->next = q->next;
  77. k->step = p->step + ;
  78. q->fail = t->fail = k;
  79. while (p && p->next[c] == q)
  80. p->next[c] = k, p = p->fail;
  81. }
  82. }
  83. else
  84. t->fail = root;
  85. last = t;
  86. }
  87.  
  88. /* MAIN FUNC */
  89.  
  90. signed main(void)
  91. {
  92. build();
  93. int n = get_i();
  94. int *s = new int[n + ];
  95. for (int i = ; i <= n; ++i)
  96. s[i] = get_i(), extend(s[i]);
  97. for (int i = ; i < n; ++i)extend(s[i]);
  98. for (node *u = root; n--; )
  99. {
  100. it v = u->next.begin();
  101. printf("%d", v->first);
  102. putchar(n ? ' ' : '\n');
  103. u = v->second;
  104. }
  105. }

@Author: YouSiki

BZOJ 2882: 工艺的更多相关文章

  1. BZOJ 2882 工艺 (字符串最小循环同构)

    题目大意: 给一个长度小于等于30W的数列,求其最小循环同构. 算法讨论: 在自动机长倍长走S后即可.注意这里面是数字,要用map存储. 今天才知道要开四倍长. Codes: #include < ...

  2. BZOJ 2882: 工艺( 后缀自动机 )

    把串S复制成SS然后扔进后缀自动机里, 从根选最小的儿子走, 走N步就是答案了...一开始还想写个treap的...后来觉得太麻烦..就用map了... ----------------------- ...

  3. BZOJ.2882.工艺(后缀自动机 最小表示 map)

    题目链接 BZOJ 洛谷 SAM求字符串的最小循环表示. 因为从根节点出发可以得到所有子串,所以每次找字典序最小的一个出边走即可.因为长度问题把原串再拼接在后面一次. 需要用map存转移.复杂度O(n ...

  4. BZOJ 2882: 工艺 [后缀自动机+map]

    Description 小敏和小燕是一对好朋友. 他们正在玩一种神奇的游戏,叫Minecraft. 他们现在要做一个由方块构成的长条工艺品.但是方块现在是乱的,而且由于机器的要求,他们只能做到把这个工 ...

  5. 【刷题】BZOJ 2882 工艺

    Description 小敏和小燕是一对好朋友. 他们正在玩一种神奇的游戏,叫Minecraft. 他们现在要做一个由方块构成的长条工艺品.但是方块现在是乱的,而且由于机器的要求,他们只能做到把这个工 ...

  6. BZOJ 2882 工艺 ——后缀自动机 最小表示法

    先说后缀自动机的做法. 直接把S串复制一遍成SS,然后建立后缀自动机,go边相当于在当前字符的后面插入,而son边可以看作在字符串前面加一个字符. 所以贪心的走字典序最小的边即可,而且根据后缀自动机的 ...

  7. bzoj 2882: 工艺【SAM】

    看上去比较SA,但是在学SAM所以就用SAM来做-- 把串复制一遍接在后面,对这个新串求SAM(这里的儿子节点要用map转移),然后从根节点每次都向最小的转移走,这样走n次转移的串就是答案 #incl ...

  8. BZOJ 2882: 工艺 (SA/SAM/最小表示法)

    我写的O(nlogn)O(nlogn)O(nlogn)的SA 8000ms 被 O(n)O(n)O(n)的SAM 2800ms 和 O(n)O(n)O(n)的最小表示法 500ms 头都锤爆- COD ...

  9. BZOJ 2882 & 后缀数组的傻逼实现

    题意: 一个字符环,求一个开头使字典序最小. SOL: 后缀数组打起来...然后居然卡过...10sec的实现我10936ms...居然卡过??? rank倒三...啦啦啦啦啦.... 改个离散化会不 ...

随机推荐

  1. nginx 访问目录403

    centos7.2默认安装好nginx后,会在/usr/share/nginx/html下作为主目录 但是如果想访问下面的目录会发现没有权限,返回403错误 这时候要注意在/etc/nginx/ngi ...

  2. SSRS ReportServer Database 的Blocking问题

    我们监控SQL SERVER数据库的阻塞情况时,老是收到在SSRS 里面出现SQL阻塞情况,刚开始由于事情多,没有太关注ReportServerTempDB里面的会话阻塞情况,但是老是出现这种频繁阻塞 ...

  3. 如何查看Windows服务器运行了多长时间

    前言:有时候管理.维护Windows服务器需要定期重启服务器(为什么需要重启,你懂的),但是这个"定期"有时候会受很多因素影响,例如某台服务器忘了重启:某台服务器那个时间段业务繁忙 ...

  4. 【转】SpringMVC中DispatcherServlet配置中url-pattern 配置/*和/的区别

    原文地址:http://m.blog.csdn.net/blog/liuxiao723846/43733287 在使用springmvc时,都会在web.xml中配置一个dispatchservlet ...

  5. C++ string类的实现

    c++中string类的实现 今天面试被考到了, 全给忘记了!!!   //string类的实现 #include <iostream> #include <string.h> ...

  6. ajax缓存问题

    默认情况下,请求总会被发出去,但浏览器有可能从它的缓存中调取数据.换句话说,在缓存过期之前,针对相同地址发起的多个Ajax请求,只有第一次会真正发送到服务端.要禁止使用缓存的结果,可以设置 cache ...

  7. Python实用环境pyenv搭建教程

    实验系统:kubuntu-15.10-desktop-amd64 关于pyenv的介绍:一般在操作系统中我们会安装多个Python版本,在*nix系统中一般默认就自带了Python2与Python3两 ...

  8. Postgresql扩展及UUID

    切换数据库 \connect $DBNAME 查看Postgresql的可用扩展 SELECT * FROM pg_available_extensions; 安装所需扩展 CREATE EXTENS ...

  9. Unix哲学

    01. 模块原则:使用简洁的接口拼合简单的部件. 02. 清晰原则:清晰胜于机巧. 03. 组合原则:设计时考虑拼接组合. 04. 分离原则:策略同机制分离,接口同引擎分离. 05. 简洁原则:设计要 ...

  10. 骨骼蒙皮动画算法(Linear Blending Skinning)

    交互式变形是编辑几何模型的重要手段,目前出现了许多实时.直观的交互式变形方法.本文介绍一种利用线性混合蒙皮(Linear Blending Skinning,LBS)技术来实现网格变形的方法,线性混合 ...