bzoj1640[Usaco2007 Nov]Best Cow Line 队列变换

bzoj1692[Usaco2007 Dec]队列变换

题意:

有一个奶牛队列。每次可以在原来队列的首端或是尾端牵出一头奶牛,把她安排到新队列的尾部,然后对剩余的奶牛队列重复以上的操作,直到所有奶牛都被插到了新的队列里。这样得到的队列,就是FJ拉去登记的最终的奶牛队列。 求对于给定的奶牛们的初始位置,计算出可能得到的字典序最小的队列。队列大小≤30000。

题解:

有一个结论:如果当前队列中的队首元素不等于队尾元素,则选小的那一边;否则选以右端点为下标的前缀和以左端点为下标的后缀中较小的那边。对于比较前缀后缀,正解是后缀数组,然而本弱偷懒写了个哈希,比较两个字符串的大小只要二分LCP,然后比较LCP的下一个字符即可。

代码:

 #include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#define inc(i,j,k) for(int i=j;i<=k;i++)
#define maxn 30010
#define ll unsigned long long
#define num 233
using namespace std; inline int read(){
char ch=getchar(); int f=,x=;
while(ch<''||ch>''){if(ch=='-')f=-; ch=getchar();}
while(ch>=''&&ch<='')x=x*+ch-'',ch=getchar();
return f*x;
}
ll hash1[maxn],hash2[maxn],mi[maxn]; int l,r,n,tot; char name1[maxn],name2[maxn],ans[maxn];
bool cmp(int x,int y){
int l=,r=min(n-x+,y),z=;
while(l<=r){
int mid=(l+r)>>;
if(hash1[x+mid-]-hash1[x-]*mi[mid]==hash2[n-y++mid-]-hash2[(n-y+)-]*mi[mid])z=mid,l=mid+;else r=mid-;
}
return name1[x+z]<=name2[n-y++z];
}
int main(){
n=read(); inc(i,,n)scanf("%s",name1+i); inc(i,,n)name2[i]=name1[n-i+]; mi[]=;
inc(i,,n)hash1[i]=hash1[i-]*num+name1[i],hash2[i]=hash2[i-]*num+name2[i],mi[i]=mi[i-]*num;
l=; r=n;
while(l<r){
if(name1[l]<name1[r])ans[++tot]=name1[l],l++;
else if(name1[l]>name1[r])ans[++tot]=name1[r],r--;
else if(cmp(l,r))ans[++tot]=name1[l],l++;
else ans[++tot]=name1[r],r--;
}
ans[++tot]=name1[l]; inc(i,,tot){printf("%c",ans[i]); if(i%==)puts("");} return ;
}

20161102

最新文章

  1. H3C qos 简单配置
  2. Stanford机器学习笔记-7. Machine Learning System Design
  3. 【BZOJ】1856: [Scoi2010]字符串
  4. rm 命令(转)
  5. SQL SERVER-Delete和Truncate的区别
  6. excel导出的集中情况
  7. RSA算法python实现
  8. Apache-rhel5.8环境下编译安装
  9. android调用音乐播放器,三种方
  10. C-一行或多行文章垂直居中
  11. webrtc视频数据render流程
  12. CSS基础知识(display和visibility、overflow、文档流)
  13. Python——查看安装位置和安装的库
  14. 如何才能够系统地学习Java并发技术?
  15. Xamarin.Android之SQLite.NET ORM
  16. mac 系统安装VM虚拟机打开时报错,提示不是虚拟磁盘的解决方式。
  17. October 06th 2017 Week 40th Friday
  18. RAID卡的结构详解
  19. VBA 删除页
  20. C#互操作

热门文章

  1. (十二)maven-surefire-plugin,用于自动化测试和单元测试的
  2. python基础001----Python+pycharm环境搭建
  3. WeChair项目Beta冲刺(2/10)
  4. Beta阶段代码与规范
  5. Beta冲刺&lt;5/10&gt;
  6. 定时任务Cron
  7. nfiniband网卡安装、使用总结
  8. Java 中的数据结构类 Vector 和 ArrayList
  9. (一)、Java内存模型
  10. skywalking学习ppt