题目描述

小敏和小燕是一对好朋友。

他们正在玩一种神奇的游戏,叫Minecraft。

他们现在要做一个由方块构成的长条工艺品。但是方块现在是乱的,而且由于机器的要求,他们只能做到把这个工艺品最左边的方块放到最右边。

他们想,在仅这一个操作下,最漂亮的工艺品能多漂亮。

两个工艺品美观的比较方法是,从头开始比较,如果第i个位置上方块不一样那么谁的瑕疵度小,那么谁就更漂亮,如果一样那么继续比较第i+1个方块。如果全都一样,那么这两个工艺品就一样漂亮。

输入输出格式

输入格式:

第一行两个整数n,代表方块的数目。

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

输出格式:

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

输入输出样例

输入样例#1:

10
10 9 8 7 6 5 4 3 2 1
输出样例#1:

1 10 9 8 7 6 5 4 3 2

说明

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

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

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

Solution:

  本题可以用后缀数组做(但是至少我现在不会,~挖坑了~),然后学了一下最小最大表示法,这题目就迎刃而解了。

  题意即对于这个循环序列,求它的字典序最小的序列。

  由于所求序列与原序列同构,所以只要知道这个字典序最小的序列的头指针在原序列中的位置就$OK$了。

  最小最大表示法其实很简单,直接设两个指针$i=0,j=1$($i,j$小于字符串长度$lenth$),比较:

  1、$s[i]<s[j]$,则$j++$;

  2、$s[i]>s[j]$,则$i=j,j=i+1$;

  3、$s[i]==s[j]$,则另取辅助指针$k$,一直往后扫:当$while(s[i+k]==s[j+k])$则$k++$,当$s[i+k]>s[j+k]$则$i=i+k$,当$s[i+k]<s[j+k]$则$j++$。

  这样最后返回$pos=min(i,j)$,则$pos$即所求的原序列的同构序列中,字典序最小的序列头指针在原序列中的下标了。

  这样去求复杂度是$O(n)$的,为什么呢?原因很简单,因为我们$i,j$都没有往回退的过程,只会往前走,那么到了边界也就结束了。

代码:

#include<bits/stdc++.h>
#define il inline
#define ll long long
using namespace std;
const int N=3e5+;
int n,a[N],i,k;
il int gi(){
int a=;char x=getchar();bool f=;
while((x<''||x>'')&&x!='-')x=getchar();
if(x=='-')x=getchar(),f=;
while(x>=''&&x<='')a=a*+x-,x=getchar();
return f?-a:a;
}
il int getmin(int *s){
int i=,j=,l;
while(i<n&&j<n){
for(l=;l<n;l++)
if(s[(i+l)%n]!=s[(j+l)%n])break;
if(l>=n)break;
if(s[(i+l)%n]>s[(j+l)%n])i+l+>j?i+=l+:i=j+;
else if(j+l+>i)j+=l+;
else j=i+;
}
return i<j?i:j;
}
int main()
{
n=gi();
for(i=;i<n;i++)a[i]=gi();
k=getmin(a),i=;
while(i<n){
printf("%d ",a[k]);
k=(++k)%n;
i++;
}
return ;
}

P1368 工艺的更多相关文章

  1. P1368 工艺 SA/最小表示法

    正解:SA/最小表示法 解题报告: 传送门! 听说正解是最小表示法,,,O(n)然后常数还挺小的,,, 但是我不会QAQ! 所以先写下SA的做法趴,,,等get了最小表示法再来写正解QAQ 就这种题算 ...

  2. 最小表示法模板(洛谷P1368 工艺)(最小表示法)

    洛谷题目传送门 最小表示是指一个字符串通过循环位移变换(第一个移到最后一个)所能得到的字典序最小的字符串. 因为是环状的,所以肯定要先转化为序列,把原串倍长. 设决策点为一个表示法的开头.比较两个决策 ...

  3. 2018.07.17 洛谷P1368 工艺(最小表示法)

    传送门 好的一道最小表示法的裸板,感觉跑起来贼快(写博客时评测速度洛谷第二),这里简单讲讲最小表示法的实现. 首先我们将数组复制一遍接到原数组队尾,然后维护左右指针分别表示两个即将进行比较的字符串的头 ...

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

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

  5. SAM练习记录

    SAM练习记录 洛谷 P1368 工艺 其实是最小表示法裸题 倍长后建SAM跑最小的边走|S|步即可 Code CF 235 C. Cyclical Quest 对主串建SAM 然后每个串倍长,跑的时 ...

  6. BZOJ 2882: 工艺

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

  7. PCB表面处理工艺

    PCB表面处理最基本的目的是保证良好的可焊性或电性能.由于自然界的铜在空气中倾向于以氧化物的形式存在,不大可能长期保持为原铜,因此需要对铜进行其他处理. 1.热风整平(喷锡) 热风整平又名热风焊料整平 ...

  8. 注塑成型工艺知识大全(Injection Molding)

    注塑成型,广泛用于热塑性塑料产品的制造工艺 工艺成本:模具费用(高),单件费用(低) 典型产品:汽车塑料部件,消费电子产品塑料外壳等 产量适合:只适合大批量生产 质量:极高的表面精确度,同一批次的产品 ...

  9. PCB工艺镀金(电金)和沉金(化金)的区别

    1.镀金和沉金的别名分别是什么?   镀金:硬金,电金(镀金也就是电金) 沉金:软金,化金 (沉金也就是化金) 2.别名的由来:  镀金:通过电镀的方式,使金粒子附着到pcb板上,所以叫电金,因为附着 ...

随机推荐

  1. IDEA无法引入已经创建的类

    解决办法: 清理一下缓存: File->Invalidate Caches/Restart... OVER!

  2. 使用deque保留有限的记录

    # 使用deque保留有限的记录 >>> from collections import deque >>> q = deque(maxlen=3) # 指定队列的 ...

  3. VSCode插件整理

    VSCode插件整理 VSCode插件整理 官网地址 vscode常用配置(User Settings文件) 基本插件 前端插件 VUE部分 python MarkDown部分 连接Linux 本地与 ...

  4. Python学习手册之控制结构(二)

    在上一篇文章中,我们介绍了Python的一些控制结构,现在我们继续介绍剩下的 Python 控制结构.查看上一篇文章请点击:https://www.cnblogs.com/dustman/p/9972 ...

  5. 数据结构的C语言基础

    数据结构的C语言基础 1. 数据输出 printf()函数为格式输出函数,它存在于标准函数库中,在C语言程序中可以直接调用,但程序源文件的开头必须包含以下命令: #include < stdi ...

  6. ctf题目writeup(2)

    2019.1.29 题目地址: https://www.ichunqiu.com/battalion 1. 点开链接: include "flag.php";$a = @$_REQ ...

  7. Matplotlib 子图的创建

    在matplotlib中,整个图像为一个Figure对象 在Figure对象中可以包含一个或者多个Axes对象  每个Axes对象相当于一个子图了 每个Axes(ax)对象都是一个拥有自己坐标系统的绘 ...

  8. 什么鬼,又不知道怎么命名class了

    什么鬼,又不知道怎么命名class了 2015/10/25 · CSS · class 分享到:5 原文出处: 结一(@结一w3cplus)    相信写css的人都会遇到下面的问题: 糟糕,怎么命名 ...

  9. Leetcode 674.最长递增序列

    最长递增序列 给定一个未经排序的整数数组,找到最长且连续的的递增序列. 示例 1: 输入: [1,3,5,4,7] 输出: 3 解释: 最长连续递增序列是 [1,3,5], 长度为3. 尽管 [1,3 ...

  10. FetchType.LAZY 时属性加上@JsonIgnore,避免返回时报错:Could not write JSON: failed to lazily initialize a collection of role

    [示例] @OneToMany(fetch=FetchType.LAZY) @JsonIgnore @Fetch(FetchMode.SELECT) @Cascade(value={CascadeTy ...