最小表示法就是直接扫过去

后缀自动机就是每次找最字典序最小儿子输出

  • 最小表示法
/*
最小表示法裸题, 我好像学过来着?? 怎么忘得这么干净 */
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
#include<iostream>
#define ll long long
#define M 300010
#define mmp make_pair
using namespace std;
int read()
{
int nm = 0, f = 1;
char c = getchar();
for(; !isdigit(c); c = getchar()) if(c == '-') f = -1;
for(; isdigit(c); c = getchar()) nm = nm * 10 + c - '0';
return nm * f;
}
int s[M]; int work(int n)
{
int i = 0, j = 1, k = 0;
while(i < n && j < n && k < n)
{
int t = s[(i + k) % n] - s[(j + k) % n];
if(t == 0)
{
k++;
}
else
{
if(t > 0) i += k + 1;
else j += k + 1;
if(i == j) j++;
k = 0;
}
}
return i < j ? i : j;
} int main()
{
int len = read();
for(int i = 0; i < len; i++) s[i] = read();
int x = work(len);
int tmp = -1;
for(int y = x; y != tmp; y = (y + 1) % len)
{
cout << s[y] << " ";
tmp = x; }
return 0;
}
  • 后缀自动机
/*
最小表示法裸题, 我好像学过来着?? 怎么忘得这么干净 */
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
#include<iostream>
#include<map>
#define ll long long
#define M 300010
#define mmp make_pair
using namespace std;
int read()
{
int nm = 0, f = 1;
char c = getchar();
for(; !isdigit(c); c = getchar()) if(c == '-') f = -1;
for(; isdigit(c); c = getchar()) nm = nm * 10 + c - '0';
return nm * f;
}
int s[M];
int len[4 * M], fa[4 * M], cnt = 1, lst = 1;
map<int, int> ch[4 * M];
void insert(int c)
{
int p = ++cnt, f = lst;
lst = p;
while(f && !ch[f][c]) ch[f][c] = p, f = fa[f];
if(!f)
{
fa[p] = 1;
}
else
{
int q = ch[f][c];
if(len[q] == len[f] + 1)
{
fa[p] = q;
}
else
{
int nq = ++cnt;
fa[nq] = fa[q];
ch[nq] = ch[q];
len[nq] = len[f] + 1;
fa[p] = fa[q] = nq;
while(f && ch[f][c] == q) ch[f][c] = nq, f = fa[f];
}
}
} int main()
{
int len = read();
for(int i = 0; i < len; i++) s[i] = read(), insert(s[i]);
for(int i = 0; i < len; i++) insert(s[i]);
int now = 1;
for(int i = 0; i < len; i++)
{
cout << ch[now].begin()->first << " ";
now = ch[now].begin()->second;
}
return 0;
}

luoguP1368 工艺(最小表示法 后缀自动机)的更多相关文章

  1. UVA 719 / POJ 1509 Glass Beads (最小表示法/后缀自动机)

    题目大意: 给出一个长度为N的字符串,求其字典序最小的循环同构. N<=10W. 算法讨论: 算法一.最小表示法.定义题. 算法二.后缀自动机. Codes: #include <iost ...

  2. POJ1509 Glass Beads(最小表示法 后缀自动机)

    Time Limit: 3000MS   Memory Limit: 10000K Total Submissions: 4901   Accepted: 2765 Description Once ...

  3. 【bzoj2882】工艺 最小表示法

    [bzoj2882]工艺 2014年12月15日1,9020 Description 小敏和小燕是一对好朋友. 他们正在玩一种神奇的游戏,叫Minecraft. 他们现在要做一个由方块构成的长条工艺品 ...

  4. 后缀自动机(SAM)

    *在学习后缀自动机之前需要熟练掌握WA自动机.RE自动机与TLE自动机* 什么是后缀自动机 后缀自动机 Suffix Automaton (SAM) 是一个用 O(n) 的复杂度构造,能够接受一个字符 ...

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. VNC Viewer连接打开remote display的VMware虚拟机出现闪退

    只需修改vnc option里面Advanced-->expert-->ColourLevel的值为“rgb222” or “full”即可. 说明:rgb111--8 colours,r ...

  2. ES查询之刨根问底

    昨天有一个需求,就是想要根据某个网关url做过滤,获取其下面所有的上下文nginx日志:如果直接"query":"https://XXX/YYY/ZZZ"发现有 ...

  3. js-自定义对话框

    引用插件 <link rel="stylesheet" type="text/css" href="${ctx }/resources/comm ...

  4. jmeter修改ServerAgent的默认端口号

    jmeter修改ServerAgent的默认端口号 1 java -jar ./CMDRunner.jar --tool PerfMonAgent --udp-port 5555 --tcp-port ...

  5. ASP.NET AJAX入门系列(3):使用ScriptManagerProxy控件

    在ASP.NET AJAX中,由于一个ASPX页面上只能有一个ScriptManager控件,所以在有母版页的情况下,如果需要在Master-Page和Content-Page中需要引入不同的脚本时, ...

  6. Rectified/无限流量/KVM/1G内存/亚洲优化/月付3.99刀起/商家首次续费优惠/91yun第600篇博文

    具体配置如下: 1v CPU + 1G 内存 + 10G SSD + 无限流量( 30T ) + 100M 口 + FreeBSD 支持 + 1IPv4 + IPv6 (可工单) + rDNS = 3 ...

  7. 基于spring的placeholder思路处理配置信息敏感信息加密解密的实践

    基于Spring的placeholder处理思路,实现系统配置信息敏感信息的加密解密处理. 我们的处理方案,是基于类org.springframework.beans.factory.config.P ...

  8. NDK学习笔记(二)

    花了点时间把pixeliop的部分看完了,拿到开发文档提供的案例稍事修改,把画面左半边压暗. 这个案例重点在于理清pixel_engine()函数中的坐标与scanline的关系. y代表当前正在调用 ...

  9. C# 调用Sql server 执行存储过程总是返回-1

    调用存储过程代码如下: 今天在写存储过程调用时遇到如下问题: int value = cmd.ExecuteNonQuery();//执行总是返回-1:且存储过程在sql 可视化执行窗口可正常执行-- ...

  10. oracle--合并行数据(拼接字符串),获取查询数据的前3条数据...

    --标准函数Lpad 可以实现左补零,但是如果多于需要长度,则会截断字符串 SELECT LPAD ('1' , 3 , '0') FROM DUAL -- return 001 情况一:需要补零.  ...