题目大意:

给一个长度小于等于30W的数列,求其最小循环同构。

算法讨论:

在自动机长倍长走S后即可。注意这里面是数字,要用map存储。 今天才知道要开四倍长。

Codes:

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. const int L = + ;
  5.  
  6. int n, a[L<<], ans;
  7.  
  8. struct State{
  9. int len, pre;
  10. map <int, int> next;
  11.  
  12. State(){
  13. len = pre = ;
  14. next.clear();
  15. }
  16. void clear(){
  17. len = pre = ;
  18. next.clear();
  19. }
  20. }st[L<<];
  21.  
  22. struct SuffixAutomaton{
  23. int sz, last;
  24.  
  25. void Init(){
  26. last = sz = ;
  27. st[].len = ; st[].pre = -;
  28. sz ++;
  29. }
  30. void Extend(int c){
  31. int cur = sz ++;
  32. st[cur].len = st[last].len + ;
  33. int p;
  34.  
  35. for(p = last; p != - && !st[p].next[c]; p = st[p].pre)
  36. st[p].next[c] = cur;
  37.  
  38. if(p == -) st[cur].pre = ;
  39. else{
  40. int q = st[p].next[c];
  41. if(st[q].len == st[p].len + ) st[cur].pre = q;
  42. else{
  43. int cle = sz ++;
  44. st[cle].len = st[p].len + ;
  45. st[cle].pre = st[q].pre;
  46. st[cle].next = st[q].next;
  47. for(; p != - && st[p].next[c] == q; p = st[p].pre)
  48. st[p].next[c] = cle;
  49. st[q].pre = st[cur].pre = cle;
  50. }
  51. }
  52. last = cur;
  53. }
  54. }SAM;
  55.  
  56. void Input(){
  57. scanf("%d", &n);
  58. for(int i = ; i < n; ++ i)
  59. scanf("%d", &a[i]);
  60. }
  61. void Output(){
  62. bool flag = false;
  63. for(int i = ans; i < ans + n; ++ i){
  64. if(!flag){
  65. flag = true;
  66. printf("%d", a[i % n]);
  67. }
  68. else
  69. printf(" %d", a[i % n]);
  70. }
  71.  
  72. printf("\n");
  73. }
  74.  
  75. void Solve(){
  76. SAM.Init();
  77. for(int i = ; i < n; ++ i)
  78. a[i + n] = a[i];
  79. for(int i = ; i < (n<<); ++ i)
  80. SAM.Extend(a[i]);
  81.  
  82. int p = ;
  83. map <int, int>:: iterator pos;
  84.  
  85. for(int i = ; i < n; ++ i){
  86. for(pos = st[p].next.begin(); pos != st[p].next.end(); ++ pos){
  87. p = (*pos).second;
  88. break;
  89. }
  90. }
  91.  
  92. ans = st[p].len - n;
  93. }
  94.  
  95. int main(){
  96.  
  97. Input();
  98. Solve();
  99. Output();
  100.  
  101. return ;
  102. }

BZOJ 2882

BZOJ 2882 工艺 (字符串最小循环同构)的更多相关文章

  1. hdu 4333"Revolving Digits"(KMP求字符串最小循环节+拓展KMP)

    传送门 题意: 此题意很好理解,便不在此赘述: 题解: 解题思路:KMP求字符串最小循环节+拓展KMP ①首先,根据KMP求字符串最小循环节的算法求出字符串s的最小循环节的长度,记为 k: ②根据拓展 ...

  2. BZOJ 2882: 工艺

    2882: 工艺 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 599  Solved: 268[Submit][Status][Discuss] D ...

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

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

  4. poj 2406 Power Strings【字符串+最小循环节的个数】

                                                                                                      Po ...

  5. KMP解决字符串最小循环节相关问题

    经典问题 : 给出一个由某个循环节构成的字符串,要你找出最小的循环节,例如 abababab 最小循环节当是 ab ,而类似 abab 也可以成为它的循环节,但并非最短. 分析 : 对于上述问题有两个 ...

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

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

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

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

  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 工艺

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

随机推荐

  1. Tomcat unable to start

    在学习springMvc时,导入springfreemarker 的jar包,写好web.xml,config.xml 后. 部署到tomcat,异常如下: 八月 27, 2016 5:44:41 下 ...

  2. hdu5353 Average(模拟)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud Average Time Limit: 4000/2000 MS (Java/Ot ...

  3. python进行base64编解码

    [转] 直接上代码 import base64 fin = open(r"D:\2.zip", "rb") fout = open(r"D:\2.x. ...

  4. 客户端技术:Cookie 服务端技术:HttpSession

    客户端技术:Cookie 服务端技术:HttpSession 07. 五 / android基础 / 没有评论   一.会话技术1.什么是会话:客户打开浏览器访问一个网站,访问完毕之后,关闭浏览器.这 ...

  5. POJ3041 二分图最大匹配

    问题:POJ3041 分析: 构造二分图:令A = B = { 1, 2, ... , n }, 分别代表行号集与列号集.假如第i行第j列有一颗行星,则连接Ai与Bj, 表示必须从Ai(即第i行),B ...

  6. The Time in Words

    def main(): time = ["one", "two", "three", "four", "fiv ...

  7. volatile详解

    海子的Java并发编程:volatile关键字解析讲的已经非常不错了,通俗易懂,给32个赞!

  8. 2015第14周五Tomcat版本

    首先看tomcat官方文档,列出的不同版本的主要差别: Servlet Spec JSP Spec EL Spec WebSocket Spec Apache Tomcat version Actua ...

  9. log4net logfornet 配置和用法

    较好的参考地址: http://in3040.blog.163.com/blog/static/116702443201091354028744/ http://dev.tot.name/dotnet ...

  10. Search in Rotated Sorted Array (I, II) 解答

    Question Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 ...