先说后缀自动机的做法。

直接把S串复制一遍成SS,然后建立后缀自动机,go边相当于在当前字符的后面插入,而son边可以看作在字符串前面加一个字符。

所以贪心的走字典序最小的边即可,而且根据后缀自动机的构建的性质,是一定可以走够len的,然后输出即可。

人生第一个后缀自动机的代码。

  1. #include<iostream>
  2. #include<cstring>
  3. #include<algorithm>
  4. #include<cmath>
  5. #include<map>
  6. #include<cstdio>
  7. #define N 600003
  8. using namespace std;
  9. int n,m,cnt,nq,np,p,q,last,root;
  10. map<int,int> ch[N*2];
  11. int fa[N*2],l[N*2],a[N];
  12. void extend(int x)
  13. {
  14. int c=a[x];
  15. p=last; np=++cnt; last=np;
  16. l[np]=x;
  17. for (;p&&!ch[p][c];p=fa[p]) ch[p][c]=np;
  18. if (!p) fa[np]=root;
  19. else {
  20. q=ch[p][c];
  21. if (l[q]==l[p]+1) fa[np]=q;
  22. else {
  23. nq=++cnt; l[nq]=l[q]+1;
  24. ch[nq]=ch[q];
  25. fa[nq]=fa[q];
  26. fa[q]=fa[np]=nq;
  27. for (;ch[p][c]==q;p=fa[p]) ch[p][c]=nq;
  28. }
  29. }
  30. }
  31. int main()
  32. {
  33. scanf("%d",&n);
  34. for (int i=1;i<=n;i++) scanf("%d",&a[i]);
  35. for (int i=1;i<=n;i++) a[n+i]=a[i];
  36. m=2*n;
  37. last=root=++cnt; ch[N].clear();
  38. for (int i=1;i<=m;i++) extend(i);
  39. p=1;
  40. map<int,int>::iterator t;
  41. for (int i=1;i<=n;i++) {
  42. t=ch[p].begin();
  43. p=t->second;
  44. if (i!=n) printf("%d ",t->first);
  45. else printf("%d\n",t->first);
  46. }
  47. }

然后再来说说最小表示法,大概的思想就是用两个指针来比较,然后不相等的时候就会排除很大的一片区间,然后最后剩下的就是最优解,最大表示法同理,写完后跑的飞快。

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <iostream>
  4. #include <algorithm>
  5. using namespace std;
  6. #define F(i,j,k) for (int i=j;i<=k;++i)
  7. #define D(i,j,k) for (int i=j;i>=k;--i)
  8. #define maxn 300005
  9. int n,a[maxn],pos;
  10.  
  11. int main()
  12. {
  13. scanf("%d",&n);
  14. F(i,1,n) scanf("%d",&a[i]);
  15. int i=1,j=2,k=0,flag=0;
  16. while (i<=n&&j<=n)
  17. {
  18. k=0;
  19. // printf("%d %d\n",i,j);
  20. while (a[(i+k-1)%n+1]==a[(j+k-1)%n+1]&&k<=n) k++;
  21. if (k==n) {pos=i;flag=1;}
  22. else
  23. {
  24. if (a[(i+k-1)%n+1]>a[(j+k-1)%n+1])
  25. {
  26. if (i+k+1<=j) i=j+1;
  27. else i=i+k+1;
  28. }
  29. else
  30. {
  31. if (j+k+1<=i) j=i+1;
  32. else j=j+k+1;
  33. }
  34. }
  35. }
  36. if (!flag) pos=min(i,j);
  37. F(i,1,n) printf("%d%c",a[(pos+i-2)%n+1],i==n?'\n':' ');
  38. }

  

BZOJ 2882 工艺 ——后缀自动机 最小表示法的更多相关文章

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

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

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

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

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

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

  4. 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 ...

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

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

  6. bzoj 1398: 寻找主人 AC自动机+最小表示法

    题目大意: 给定两个序列判断是否循环同构,若循环同构则输出最小表示 题解: 因为没有样例输入输出,一开始没看到要求输出最小表示 Wa一大页. 但不得不说bzoj还是挺高效的: 赞一个 XD.jpg 判 ...

  7. 洛谷 P1368 工艺 后缀自动机 求最小表示

    后缀自动机沙茶题 将字符串复制一次,建立后缀自动机. 在后缀自动机上贪心走 $n$ 次即可. Code: #include <cstdio> #include <algorithm& ...

  8. BZOJ 2882: 工艺

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

  9. 【BZOJ2882】工艺 后缀自动机

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

随机推荐

  1. uvm_reg_defines——寄存器模型(四)

    文件: src/marcos/uvm_reg_defines 类: 无 该文件是寄存器模型src/reg/* 文件对于的宏文件,主要定义了寄存器地址位宽,寄存器数据位宽,字节的大小.计算机从最初的8, ...

  2. Easyui combobox如何默认选中第一项???

    以下代码可以实现combobox默认选中第一项,在实际开发中我们可能会用到! // 处理combobox默认选中的问题 <input id="user_type" class ...

  3. jmeter中登录和提交收银出现的错误

    登录出现的错误 登录界面如图所示: 为了防止登录跳转的问题response code 302的问题,要设置 2.提交收银界面 当系统设置必须传送jison格式时,要在HTTP Header Manag ...

  4. COGS 1710. [POJ2406]字符串的幂

    ★☆   输入文件:powerstrings.in   输出文件:powerstrings.out   简单对比时间限制:3 s   内存限制:256 MB [题目描述] 对于给定的两个字符串a,b, ...

  5. SQL Server2005的数据还原与备份具体步骤

    一:备份数据库步骤 1. 第一步:在开始—>程序(P)—>MicrosoftSQLserver2005—>SQLServerManagementStudio(如下图) 2. 第二步: ...

  6. 转载自infoq:MYSQL的集群方案

    分布式MySQL集群方案的探索与思考 2016-04-29 张成远  “本文整理自ArchSummit微信大讲堂张成远线上群分享内容   背景   数据库作为一个非常基础的系统,任何一家互联网公司都会 ...

  7. Mac app 破解之路

    6年之前一直做过一些内存挂,脚本挂.都是比较低级的技术. 这几年期间,断断续续利用业余时间学了一些汇编的知识,当时只是想着破解游戏. 所有的黑技术都是业余自学的,没有老师可以问,只能百度和自己领悟,比 ...

  8. Caused by: java.lang.ClassNotFoundException: java.com.bj186.ssm.controller.UserController

    在搭建SpringMVC的时候,遇到的这个问题真的很奇葩, 找不到UserController这个类 这明明不就在工程目录下吗? 经过了一番艰苦卓绝的斗争, 才发现原来是包导少了 之前导入的包是: & ...

  9. Mysql插入中文时提示:ERROR 1366 (HY000): Incorrect string value: '\xE5\x8F\xB0\xE5\xBC\x8F...' fo

    Mysql插入数据时提示:ERROR 1366 (HY000): Incorrect string value: ‘\xE5\x8F\xB0\xE5\xBC\x8F…’ fo 分析如下: 首先通过语句 ...

  10. web框架 http协议

    http 协议是超文本传输协议,位于osi七层的应用层,协议规定的就是请求与响应双方的一个消息格式,请求(请求行,请求头,空行,请求数据,请求行--请求方式URL协议版本\r\n请求头--user-a ...