●BZOJ 1692 [Usaco2007 Dec]队列变换
题链:
http://www.lydsy.com/JudgeOnline/problem.php?id=1692
题解:
后缀数组,贪心
由于每次可以取出旧队列的首部或尾部放在新队列的尾部。
所以就需要比较旧队列的首部开始的后缀和尾部开始的前缀(反过来)的字典序大小。
于是考虑把原串反向,兵和原串拼接在一起,用分隔符隔开,并求出后缀排名,用于之后的比较。
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#define MAXN 60500
#define filein(x) freopen(#x".in","r",stdin);
#define fileout(x) freopen(#x".out","w",stdout);
using namespace std;
char S[MAXN];
int sa[MAXN],rak[MAXN],hei[MAXN],bel[MAXN];
void build(int N,int M){
static int cc[MAXN],ta[MAXN],tb[MAXN],*x,*y,h,p;
x=ta; y=tb; h=0;
for(int i=0;i<M;i++) cc[i]=0;
for(int i=0;i<N;i++) cc[x[i]=S[i]]++;
for(int i=1;i<M;i++) cc[i]+=cc[i-1];
for(int i=N-1;i>=0;i--) sa[--cc[x[i]]]=i;
for(int k=1;p=0,k<N;k<<=1){
for(int i=N-k;i<N;i++) y[p++]=i;
for(int i=0;i<N;i++) if(sa[i]>=k) y[p++]=sa[i]-k;
for(int i=0;i<M;i++) cc[i]=0;
for(int i=0;i<N;i++) cc[x[y[i]]]++;
for(int i=1;i<M;i++) cc[i]+=cc[i-1];
for(int i=N-1;i>=0;i--) sa[--cc[x[y[i]]]]=y[i];
swap(x,y); y[N]=-1; x[sa[0]]=0; M=1;
for(int i=1;i<N;i++)
x[sa[i]]=y[sa[i]]==y[sa[i-1]]&&y[sa[i]+k]==y[sa[i-1]+k]?M-1:M++;
if(M>=N) break;
}
for(int i=0;i<N;i++) rak[sa[i]]=i;
for(int i=0,j;i<N;i++){
if(h) h--;
if(rak[i]){
j=sa[rak[i]-1];
while(S[i+h]==S[j+h]) h++;
}
hei[rak[i]]=h;
}
}
int main()
{
int N,l,r,n,cnt=0;
scanf("%d",&N);n=N; l=0; r=N-1;
for(int i=0;i<N;i++) scanf(" %c",&S[i]); S[N]='&';
for(int i=N-1;i>=0;i--) S[N+N-i]=S[i]; N+=N+1;
build(N,300); while(l<=r){
if(rak[l]<rak[n+n-r]) printf("%c",S[l++]);
else printf("%c",S[r--]);
if(++cnt==80) printf("\n"),cnt=0;
} return 0;
}
●BZOJ 1692 [Usaco2007 Dec]队列变换的更多相关文章
- BZOJ 1692: [Usaco2007 Dec]队列变换( 贪心 )
数据 n <= 30000 , 然后 O( n² ) 的贪心也过了..... USACO 数据是有多弱啊 = = ( ps : BZOJ 1640 和此题一模一样 , 双倍经验 ) ------ ...
- BZOJ 1692: [Usaco2007 Dec]队列变换 [后缀数组 贪心]
1692: [Usaco2007 Dec]队列变换 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1383 Solved: 582[Submit][St ...
- [BZOJ 1692] [Usaco2007 Dec] 队列变换 【后缀数组 + 贪心】
---恢复内容开始--- 题目链接:BZOJ - 1692 题目分析 首先,有个比较简单的贪心思路:如果当前剩余字符串的两端字母不同,就选取小的字母,这样显然是正确的. 然而若两端字母相同,我们怎么选 ...
- BZOJ 1692: [Usaco2007 Dec]队列变换
Description FJ打算带他的N(1 <= N <= 30,000)头奶牛去参加一年一度的"全美农场主大奖赛".在这场比赛中,每个参赛者都必须让他的奶牛排成一列 ...
- bzoj:1692 [Usaco2007 Dec]队列变换&&1640 [Usaco2007 Nov]Best Cow Line 队列变换
Description FJ打算带他的N(1 <= N <= 30,000)头奶牛去参加一年一度的“全美农场主大奖赛”.在这场比赛中,每个参赛者都必须让他的奶牛排成一列,然后领她们从裁判席 ...
- bzoj 1692: [Usaco2007 Dec]队列变换 ——二分+hash
Description FJ打算带他的N(1 <= N <= 30,000)头奶牛去参加一年一度的“全美农场主大奖赛”.在这场比赛中,每个参赛者都必须让他的奶牛排成一列,然后领她们从裁判席 ...
- BZOJ 1692: [Usaco2007 Dec]队列变换 (后缀数组/二分+Hash)
跟BZOJ 4278: [ONTAK2015]Tasowanie一模一样 SA的做法就是把原串倒过来接在原串后面,O(nlogn)O(nlogn)O(nlogn)做后缀数组,就能O(1)O(1)O(1 ...
- 1692: [Usaco2007 Dec]队列变换(BZOJ1640强化版)
1692: [Usaco2007 Dec]队列变换 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 682 Solved: 280[Submit][Sta ...
- 【BZOJ】1692: [Usaco2007 Dec]队列变换
[算法]字符串hash [题解] 显然如果字母互不相同,贪心取是正确的. 如果存在字母相同,那么就换成比较后缀和前缀嘛. 但是要注意,不是后缀和前缀相同就能直接跳跃,每次必须只推一位. 取模的哈希比自 ...
随机推荐
- Java作业-多线程
未完成,占位以后补 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 书面作业 本次PTA作业题集多线程 源代码阅读:多线程程序BounceThread 1.1 Ball ...
- 201621123044 《Java程序设计》第六周实验总结
1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图或相关笔记,对面向对象思想进行一个总结. 注1:关键词与内容不求多,但概念之间的联系要清晰 ...
- 在Nginx上配置多个站点
有时候你想在一台服务器上为不同的域名运行不同的站点.比如www.siteA.com作为博客,www.siteB.com作为论坛.你可以把两个域名的IP都解析到你的服务器上,但是没法在Nginx的根目录 ...
- PHP截取日期
date( 'Y-m-d ',strtotime('2017-10-9 12:23:35')) 通过时间格式,获取的是2017-10-9
- 在bootstrap中让竖向排列的输入框水平排列
在bootstrap中可以使用自带的样式标记来控制样式,但是同时可以利用最原始的css样式来解决达到需求 如下所示可以看出来两个inline-block就可以使得两个水平排列 block和inline ...
- emqtt 试用(六)系统主题
$SYS-系统主题 EMQ 消息服务器周期性发布自身运行状态.MQTT 协议统计.客户端上下线状态到 $SYS/ 开头系统主题. $SYS 主题路径以 "$SYS/brokers/{node ...
- 单点登录实现机制:桌面sso
参考链接,感谢作者:https://zm10.sm-tc.cn/?src=l4uLj8XQ0IiIiNGckZ2TkJiM0ZyQktCZlo2Mi5uNmp6S0I/QysrJyszPztGXi5K ...
- HTTP协议扫盲(三)HTTP协议的请求头列表和分类描述
一.请求报头和响应报头列表 1.Requests 头列表 Header 解释 示例 Accept 指定客户端能够接收的内容类型 Accept: text/plain, text/html Accept ...
- HTTP协议扫盲(二)HTTP协议的请求方法、请求头和响应头
一.HTTP请求方法 Http协议定义了很多与服务器交互的方法,最基本的有4种,分别是GET,POST,PUT,DELETE. 一个URL地址用于描述一个网络上的资源,而HTTP中的GET, POST ...
- OAuth2.0学习(1-3)OAuth2.0的参与者和流程
OAuth(开放授权)是一个开放标准.允许第三方网站在用户授权的前提下访问在用户在服务商那里存储的各种信息.而这种授权无需将用户提供用户名和密码提供给该第三方网站. OAuth允许用户提供一个令牌给第 ...