BZOJ2882: 工艺
题解:
裸的字符串最小表示。。。
可以戳这里:http://www.cnblogs.com/ACAC/archive/2010/05/23/1742349.html
这里说一下为什么a[i+k]>a[j+k]的时候可以让 i 跳到 i+k+1
也就是说i-i+k这一段不会有一个后缀成为最小表示的前缀,那我们只要构造出一个比它小的就可以了。
显然 如果我们取a[i+x]--a[i+k+1],我们总有a[j+x]--a[j+x+1]比它小,也就是在长度不及len的时候就不是最小了所以不可能是最小表示。
所以我们枚举起点看看它能够延伸多长始终都是同长度中最小的,当该长度为len的时候说明它就是最小表示。
还有最后为什么要返回min(i,j)
因为。。。挖坑待填。。。
代码:
#include<cstdio> #include<cstdlib> #include<cmath> #include<cstring> #include<algorithm> #include<iostream> #include<vector> #include<map> #include<set> #include<queue> #include<string> #define inf 1000000000 #define maxn 300000+5 #define maxm 20000000+5 #define eps 1e-10 #define ll long long #define pa pair<int,int> #define for0(i,n) for(int i=0;i<=(n);i++) #define for1(i,n) for(int i=1;i<=(n);i++) #define for2(i,x,y) for(int i=(x);i<=(y);i++) #define for3(i,x,y) for(int i=(x);i>=(y);i--)
#define for4(i,x) for(int i=head[x],y;i;i=e[i].next) #define mod 1000000007 using namespace std; inline int read() { int x=,f=;char ch=getchar(); while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();} while(ch>=''&&ch<=''){x=*x+ch-'';ch=getchar();} return x*f; }
int n,a[maxn]; int main() { freopen("input.txt","r",stdin); freopen("output.txt","w",stdout); n=read();
for0(i,n-)a[i]=read();
int i=,j=,k=;
while(i<n&&j<n&&k<n)
{
int t=a[(i+k)%n]-a[(j+k)%n];
if(!t)k++;
else
{
k=;
if(t>)i+=k+;else j+=k+;
if(i==j)i++;
}
}
int ans=min(i,j);
printf("%d",a[ans%n]);
for1(i,n-)printf(" %d",a[(ans+i)%n]); return ; }
2882: 工艺
Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 48 Solved: 24
[Submit][Status]
Description
Input
Output
Sample Input
10 9 8 7 6 5 4 3 2 1
Sample Output
HINT
【数据规模与约定】
对于20%的数据,n<=1000
对于40%的数据,n<=10000
对于100%的数据,n<=300000
BZOJ2882: 工艺的更多相关文章
- BZOJ2882 工艺【SAM】 最小循环串
BZOJ2882 工艺 给出一个串,要求其循环同构串中字典序最小的那个 串翻倍建\(SAM\)然后从起点开始贪心的跑\(n\)次即可 当然也能用最小表示法来做 #include<bits/std ...
- [bzoj2882]工艺_后缀数组
工艺 bzoj-2882 题目大意:题目链接. 注释:略. 想法: 跟bzoj1031差不多啊. 把串倍长后扫$sa$数组. 最后再统计答案即可. Code: #include <iostrea ...
- BZOJ2882工艺
题目描述 小敏和小燕是一对好朋友. 他们正在玩一种神奇的游戏,叫Minecraft. 他们现在要做一个由方块构成的长条工艺品.但是方块现在是乱的,而且由于机器的要求,他们只能做到把这个工艺品最左边的方 ...
- bzoj千题计划284:bzoj2882: 工艺
http://www.lydsy.com/JudgeOnline/problem.php?id=2882 将串S复制一遍变成SS 对SS构建后缀自动机,在上面走标号最小的边len(S)步,即可得最小循 ...
- BZOJ2882: 工艺(后缀数组)
题意 题目链接 Sol 直接把序列复制一遍 后缀数组即可 在前\(N\)个位置中取\(rak\)最小的输出 #include<bits/stdc++.h> using namespace ...
- BZOJ2882:工艺(SAM)
Description 小敏和小燕是一对好朋友. 他们正在玩一种神奇的游戏,叫Minecraft. 他们现在要做一个由方块构成的长条工艺品.但是方块现在是乱的,而且由于机器的要求,他们只能做到把这个工 ...
- Bzoj2882 工艺 [线性算法]
后缀自动机题解 -> http://www.cnblogs.com/SilverNebula/p/6420601.html 后缀自动机敲完,看了下排行,wc为什么别人跑得这么快?……是诶,这最小 ...
- bzoj2882工艺(最小表示法)
O(nlogn)的做法十分显然,有三种可以做到O(nlogn)的:1.最容易的想法:把串扩展成两倍,然后跑一遍SA求后缀数组.2.求后缀同样也可以用SAM去求解,用map存一下.3.最暴力的方法:直接 ...
- 【不能继续浪啦】BZ做题记录[7.01~7.06]
距离上次提交..><居然已经过去一个半月了... 然后再去看看人家RXDoi.. 差距越来越大啦... 最后更新时间:7.06 19:06 [07.03 21:02]夏令营自修课逃逃真爽. ...
随机推荐
- window2003安全设置
1. 网上邻居->右键 属性->本地连接 右键属性->Microsoft网络的文件和打印机共享去掉选中 (影响端口: 139,445) 2. 禁止ADMIN$缺省共享 ...
- scala知识点(二)
Scala允许使用三个引号来进行多行字符引用:(引自) val longString = """Line 1 Line Line """; ...
- scrapy-redis使用详解
描述: 1.使用两台机器,一台是win10,一台是centos7,分别在两台机器上部署scrapy来进行分布式抓取一个网站 2.centos7的ip地址为192.168.1.112,用来作为redis ...
- linux系统文件属性及企业精典故障案例
linux系统文件属性: [root@nginx_back ~]# stat keepalived-1.2.7.tar.gz 查看文件属性 File: "keepalived-1.2.7.t ...
- flex打印图片
<?xml version="1.0" encoding="utf-8"?><s:WindowedApplication xmlns:fx=& ...
- 【转】perl 变量 $/ 的用法解析 上下文为行模式时,$/ 定义以什么来区分行
默认状态下,很显然都是用\n来区分行,\n也被我们称作为换行符. 当读取序列时,按行来读取时,就是以换行符为标准. 读取的strawberry1.gb的文件内容如下: LOCUS JX118024 4 ...
- crtmpserver的安装,摄像头视频测试
下载 svn co --username anonymous --password "" https://svn.rtmpd.com/crtmpserver/branches/1. ...
- 九度OJ - 题目1481:Is It A Tree?
题目描述: A tree is a well-known data structure that is either empty (null, void, nothing) or is a set o ...
- 免费web直接打印的控件PAZU
PAZU 是4Fang 四方为配合"四方在线"软件于2004年开发的WEB打印控件,适用于各种WEB软件项目的打印.PAZU是客户端软件,使用于IE作为客户端的所有应用,与服务器端 ...
- ExtJS4.2学习(五)表格渲染与复选框
鸣谢:http://www.shuyangyang.com.cn/jishuliangongfang/qianduanjishu/2013-11-10/174.html --------------- ...