BZOJ 1640: [Usaco2007 Nov]Best Cow Line 队列变换

Description

FJ打算带着他可爱的N (1 ≤ N ≤ 2,000)头奶牛去参加”年度最佳老农”的比赛.在比赛中,每个农夫把他的奶牛排成一列,然后准备经过评委检验. 比赛中简单地将奶牛的名字缩写为其头字母(the initial letter of every cow),举个例子,FJ带了Bessie, Sylvia,和Dora,那么就可以缩写为BSD. FJ只需将奶牛的一个序列重新排列,然后参加比赛.他可以让序列中的第一头奶牛,或者最后一头走出来,站到新队列的队尾. 利欲熏心的FJ为了取得冠军,他就必须使新队列的字典序尽量小. 给你初始奶牛序列(用头字母)表示,然后按照上述的规则组成新序列,并使新序列的字典序尽量小.

Input

第1行:一个整数N.

第2行至第N+1行:每行一个大写字母,表示初始序列中该奶牛的头字母.

Output

得到的最小字典序的序列.每输出80个字母需要一个换行!

题解:

将该串后面加一个特殊字符后将原串翻转接到后面,求这个新串的后缀数组、rank数组,就可以O(1)快速比较是从后面取较优还是从前面取较优。

贪心取即可。

代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>//by zrt
//problem:
using namespace std;
typedef long long LL;
const int inf(0x3f3f3f3f);
const double eps(1e-9);
char s[60005];
int n,m;
const int MAXN=60005;
int sa[MAXN],t[MAXN],t2[MAXN],c[MAXN],rank[MAXN];
void build_sa(int m){int *x=t,*y=t2;for(int i=0;i<m;i++) c[i]=0;for(int i=0;i<n;i++) c[x[i]=s[i]]++;for(int i=1;i<m;i++) c[i]+=c[i-1];for(int i=n-1;i>=0;i--) sa[--c[x[i]]]=i;for(int k=1;k<=n;k<<=1){int p=0;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++) c[i]=0;for(int i=0;i<n;i++) c[x[y[i]]]++;for(int i=1;i<m;i++) c[i]+=c[i-1];for(int i=n-1;i>=0;i--) sa[--c[x[y[i]]]]=y[i];swap(x,y);p=1;x[sa[0]]=0;for(int i=1;i<n;i++){x[sa[i]]=y[sa[i-1]]==y[sa[i]]&&y[sa[i-1]+k]==y[sa[i]+k]?p-1:p++;}if(p>=n) break;m=p;}
}
int main(){#ifdef LOCALfreopen("in.txt","r",stdin);freopen("out.txt","w",stdout);#endifscanf("%d",&n);for(int i=0;i<n;i++) scanf("%s",&s[i]);s[n]='$';for(int i=0;i<n;i++) s[i+n+1]=s[n-i-1];m=n;n<<=1;n=n+1;s[n]='\0';build_sa(128);for(int i=0;i<n;i++) rank[sa[i]]=i;int cc=0;int l=0,r=m-1;for(int i=0;i<m;i++){int a=rank[l];int b=rank[(m-r)+m];cc++;if(a<b){putchar(s[l++]);}else putchar(s[r--]);if(cc==80) cc=0,putchar('\n');}return 0;
}

转载于:https://www.cnblogs.com/zrts/p/bzoj1640.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/575237.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JAVA语言运算符(算数运算符、赋值运算符、比较运算符、逻辑运算符、三元运算)

运算符 JAVA语言中将运算符分为&#xff1a;算数运算符、赋值运算符、比较运算符、逻辑运算符、三元运算符。 算数运算符&#xff1a;算数运算符是对数字进行一系列的加减乘除等的计算&#xff0c;常见的算数运算符如&#xff1a; public class Operation{public static vo…

真彩色图像数据量 计算_军职在线大学计算机基础(自主模式)

第一章单选题电子计算机的发展已经经过了4代&#xff0c;4代计算机的主要元器件分别是(b)a.电子管&#xff0c;晶体管&#xff0c;中小规模集成电路&#xff0c;激光器件b.电子管&#xff0c;晶体管&#xff0c;中小规模集成电路&#xff0c;大规模或超大规模集成电路 c.晶体管…

hdu 2570 贪心

贪心的经典题型 该死的精度问题&#xff0c;WA了好几次&#xff0c;以后能用乘的绝不用除&#xff01;&#xff01; #include<iostream> #include<algorithm> #include<cstdio>using namespace std;int main(){int n,v,w,k,i;int p[111],t[111];cin>>k…

JAVA语言中流程控制(顺序结构、判断语句、循环语句)

流程控制&#xff1a; 程序在执行的过程中&#xff0c;各条语句的执行顺序对程序的结果是有直接影响的&#xff0c;所以&#xff0c;我们必须清楚每条语句的执行流程。而且&#xff0c;很多时候我们要通过控制语句的执行顺序来实现想要的功能。java中流程控制有&#xff1a;顺…

python下载文件暂停恢复_selenium+Python如何取消Chrome下载文件的‘保留’‘放弃’提示?...

本人在做自动化测试的时候遇到问题&#xff0c;自动导出文件的步骤可以执行&#xff0c;但是文件并没有成功导出到目标目录&#xff0c;经debug发现&#xff0c;Chrome卡在了下载询问的窗口页面&#xff0c;就是底部弹出窗口询问是否‘保留’或者‘放弃’的那个页面。所以脚本执…

2014/9/12 play with thesick siyang baby.

11:48 2014/9/12再怎么无聊的游戏&#xff0c;在思杨宝宝的眼里都是那么好玩&#xff0c;那么有趣。昨天回去和他玩老鹰抓小鸡的游戏&#xff0c;我当老鹰&#xff0c;他当小兔子。我看他跑到奶奶屋里&#xff0c;就冲进去把他“抓走”&#xff0c;然后扔到我的屋里。思杨乐的啊…

java中JShell脚本工具、常量优化、集成开发环境IDEA

JShell脚本工具&#xff1a; jshell:直接在DOS命令行&#xff08;黑窗口&#xff09;键入main方法中的代码就可以快速看到运行的结果&#xff0c;无需编译再运行&#xff0c;并且省略了入口方法及定义类的过程&#xff0c;其使用方法&#xff1a; 1.打开黑窗口后键入&#xf…

ASP.NET MVC3 学习心得------路由机制

9.1 理解URL URL满足的要求&#xff1a; l 域名易于记忆和拼写 l 简短、易输入 l 可以反应出站点的结构 l 可破解&#xff0c;用户可以通过移除URL的末尾&#xff0c;进而达到更高层次的信息体系结构 l 持久、不能变化 9.2路由机制的概述 ASP.NET MVC中路由机制的两种用途&…

python编写arcgis脚本教程_ArcGIS使用Python脚本工具

在Pyhton写的一些代码&#xff0c;用户交互不方便&#xff0c;用户体验比较差&#xff0c;不方便重用。在ArcGIS中可以将用写的Python代码导入到ToolBox中&#xff0c;这样用起来就比较方便了。这里用按要素裁剪栅格的Python来演示如何导入ArcGIS中。代码如下&#xff1a; impo…

初步认识java中的方法

java中方法&#xff1a; 方法&#xff1a;是将一个功能抽取出来&#xff0c;把代码单独定义在一个大括号内&#xff0c;形成一个单独的功能。需要这个功能的时候&#xff0c;就可以去调用。这样即实现了代码的复用&#xff0c;也解决了代码冗余的问题。 public class Methods…

python中可以使用变量来引用函数吗_如何在python语言中使用函数变量并调用函数...

在python语言中&#xff0c;除了常规变量之外&#xff0c;还有函数变量。把函数本身赋值给变量&#xff0c;这个变量为函数变量。工具/原料 python pycharm 截图工具 WPS 方法/步骤 1 在已新建的python文件中&#xff0c;定义函数mul_data&#xff0c;传入两个参数param和exp2 …

ACM竞赛常用STL(二)之STL--algorithm

<algorithm>无疑是STL 中最大的一个头文件&#xff0c;它是由一大堆模板函数组成的。下面列举出<algorithm>中的模板函数&#xff1a; adjacent_find / binary_search / copy / copy_backward / count/ count_if / equal / equal_range / fill / fill_n / find /fi…

C语言程序设计现代方法1,2,3章

1&#xff1a;浮点型&#xff08;float&#xff09;运算比int慢&#xff0c;并且可能存在舍入误差 如float存储0.1&#xff0c;以后使用可能会变成0.099999999987 2&#xff1a;宏定义只用大写&#xff0c;这是大多数C程序猿遵循的规范&#xff01; C语言区分大小写&#xff0c…

python全栈要学什么_python全栈要学什么 python全栈学习路线

IT行业&#xff0c;技术要比学历、年龄、从业经验更为重要&#xff0c;技术水平直接决定就业薪资&#xff0c;想要学好python&#xff0c;首先要先了解精通Python语言基础、Python web开发、Python爬虫、Python数据分析这四大方面。 全栈即指的是全栈工程师&#xff0c;指掌握多…

初识java中数组、数组在内存中、越界异常、空指针异常

数组&#xff1a; 当存储多个数据时&#xff0c;此时可能会使用多个变量&#xff0c;这样不断声明变量会很麻烦&#xff0c;而这些变量都有相似的特性&#xff0c;因此我们可以将它们存放到一个容器中&#xff0c;统一处理。 容器&#xff1a;是将多个数据存储到一起&#xf…

异常处理python 空气质量问题_python的异常处理

异常处理什么是异常&#xff1f;首先要清楚&#xff0c;什么是异常&#xff0c;异常就是程序运行时发生错误的信号(在程序出现错误时&#xff0c;则会产生一个异常&#xff0c;若程序没有处理它&#xff0c;则会抛出该异常&#xff0c;程序的运行也随之终止)&#xff0c;在pyth…

Android获取屏幕实际高度跟显示高度,判断Android设备是否拥有虚拟功能键

//获取屏幕尺寸&#xff0c;不包括虚拟功能高度 getWindowManager().getDefaultDisplay().getHeight();获取屏幕原始尺寸高度&#xff0c;包括虚拟功能键高度&#xff0c; private int getDpi(){ int dpi 0;Display display getWindowManager().getDefaultDisplay();Displa…

cad小插件文字刷_文字狗最佳排版神器 小恐龙公文排版助手Office WPS插件

文字狗最佳排版神器文字狗最佳排版神器 小恐龙公文排版助手Office WPS插件1.85最新版 无需注册、无需其他费用、无广告。相信大家所需要提交的各种论文、报告等Word文档都对格式有着非常严格的要求&#xff0c;对标题、目录、正文都有不同的要求。尤其是对于公文&#xff0c;要…

Java中的对象、private关键字、this关键字、构造方法

面向对象 概述&#xff1a;Java一种面向对象的程序设计语言&#xff0c;面向对象思想是一种程序设计思想&#xff0c;在面向对象思想的指引下&#xff0c;使用Java语言去设计、开发计算机程序。 这里的对象泛指现实中一切事物&#xff0c;每种事物都具备自己的属性和行为。 …

2060显卡驱动最新版本_教程:怎么安装更新NVIDIAAMD显卡驱动?

PART-1:装驱动这么简单的事情真的需要写教程吗&#xff1f;我自己都理解不了我为什么要写这样一个教程&#xff0c;但是如你所见&#xff0c;他确实被我写出来了&#xff0c;而且对大部分人都挺有用。首先&#xff0c;使用鲁大师以及驱动精灵这类软件的同学自己喜欢就好&#x…