P2870 [USACO07DEC]最佳牛线,黄金Best Cow Line, Gold(加强版)(贪心+hash哈希)


洛谷上这道水题丧心病狂地把数据范围加到了500000
普通的做法肯定A不了了,所以用二分哈希去找第一个不同的地方。
在比较谁字典序小的时候,二分查找哈希值,找到最小元素使得哈希值不一样,然后比较就好了。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define debug(x) cerr<<#x<<" = "<<x<<endl
#define debugs(x,y) cerr<<#x<<" = "<<x<<"   "<<#y<<" = "<<y<<endl
const ll N=5e5+7;
const ll base=137;//哈希base
const ll mod=2147483647;
template<typename T>inline T read(T &x)
{x=0;ll f=1;char c;while(!isdigit(c=getchar()))if(c=='-')f=-1;while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}return x*f;
}
ll n,m,ha[N],hb[N],p[N],a[N],b[N],c[N];
char ch[3];
inline ll get_ha(ll l,ll r)//哈希正
{return ha[r]-ha[l-1]*p[r-l+1];
}
inline ll get_hb(ll l,ll r)//哈希逆
{return hb[r]-hb[l-1]*p[r-l+1];
}
inline ll find_distinct(ll i,ll j)
{ll L=0,R=n-j-i+2,mid;while(L<R){mid=L+R>>1;if(get_ha(i,i+mid)^get_hb(j,j+mid))R=mid;//相同为0不同为1;else L=mid+1;}return L;
}
int main()
{read(n);p[0]=1;for(register ll i=1;i<=n;++i)scanf("%s",ch),a[i]=b[n-i+1]=ch[0]-'A';for(register ll i=1;i<=n;++i)p[i]=p[i-1]*base;for(register ll i=1;i<=n;++i)ha[i]=ha[i-1]*base+a[i];for(register ll i=1;i<=n;++i)hb[i]=hb[i-1]*base+b[i];ll i=1,j=1;while(i<=n-j+1){ll len=find_distinct(i,j);if(a[i+len]<=b[j+len])c[++m]=a[i++];else c[++m]=b[j++];}for(register ll i=1;i<=m;++i){printf("%c",c[i]+'A');i%80?0:puts("");}return 0;
}

P2870 [USACO07DEC]最佳牛线,黄金Best Cow Line, Gold(加强版)(贪心+hash哈希)相关推荐

  1. [USACO 07DEC]Best Cow Line, Gold

    Description 题库链接 给以长度为 \(n\) 的字符串,要求每次只能从两边取一个字符,使得取出来之后字典序最小. \(1\leq n\leq 30000\) Solution 将字符串翻转 ...

  2. P2870 [USACO07DEC]Best Cow Line G

    P2870 [USACO07DEC]Best Cow Line G 题意: 给你一个字符串,每次从首或尾取一个字符组成字符串,问所有能够组成的字符串中字典序最小的一个. 题解: 现在要组成字典序最小的 ...

  3. 洛谷 P3014 [USACO11FEB]牛线Cow Line

    P3014 [USACO11FEB]牛线Cow Line 题目背景 征求翻译.如果你能提供翻译或者题意简述,请直接发讨论,感谢你的贡献. 题目描述 The N (1 <= N <= 20) ...

  4. P1569 [USACO11FEB]属牛的抗议Generic Cow Prote…

    P1569 [USACO11FEB]属牛的抗议Generic Cow Prote- 题目描述 Farmer John's N (1 <= N <= 100,000) cows are li ...

  5. 洛谷 2953 [USACO09OPEN]牛的数字游戏Cow Digit Game

    洛谷 2953  [USACO09OPEN]牛的数字游戏Cow Digit Game 题目描述 Bessie is playing a number game against Farmer John, ...

  6. 《算法竞赛进阶指南》打卡-基本算法-AcWing 102. 最佳牛围栏:浮点数二分、前缀和、双指针

    文章目录 题目 题解 题目 农夫约翰的农场由 N 块田地组成,每块地里都有一定数量的牛,其数量不会少于 1 头,也不会超过 2000 头. 约翰希望用围栏将一部分连续的田地围起来,并使得围起来的区域内 ...

  7. SpringCloud 应用在 Kubernetes 上的最佳实践 — 线上发布(优雅上下线)

    作者 | 骄龙 导读:本篇是<SpringCloud 应用在 Kubernetes 上的最佳实践>系列文章的第八篇,主要介绍了如何做到流量的无损上/下线.更多相关文章阅读可查看文末. 前言 ...

  8. SpringCloud 应用在 Kubernetes 上的最佳实践 — 线上发布(可回滚)

    作者 | 长门 **导读:**本篇是<SpringCloud 应用在 Kubernetes 上的最佳实践>系列文章的第七篇,主要介绍了新功能上线时,如何尽快减少对线上用户的影响?发布系统需 ...

  9. SpringCloud 应用在 Kubernetes 上的最佳实践 — 线上发布(可监控)

    作者 | 骐羽 阿里巴巴技术专家 导读:本篇是"SpringCloud 应用在 Kubernetes 上的最佳实践"系列文章的第六篇,主要介绍了如何保障生产环境服务稳定,做到随时发 ...

最新文章

  1. 安卓帧数监测软件_土壤墒情监测仪
  2. SendTextMessage 等方便的消息发送函数
  3. 3Delight NSI: A Streamable Render API
  4. 使用URL直接进入SAP CRM WebClient UI某个订单的明细页面
  5. 语言怎么得到直流电压并采样_交流电AC如何转换成直流电DC?
  6. linux集群服务有什么用,使用MOSIX搭建Linux的高性能集群服务
  7. python ddos 检测系统_python 检查是否存在ddos攻击
  8. get 请求中文乱码问题
  9. LeetCode781森林中的兔子题解
  10. 如何批量查询百度指数
  11. 人人都能写游戏系列(三)Unity 3D平衡球游戏
  12. Java开发-应届生面试常常涉及到的问题
  13. [生存志] 第43节 齐文姜齐宣姜争艳
  14. Linux资源控制-CPU和内存
  15. Welcome to Pete Brown's 10rem.net
  16. 如何运用计算机设计主题墙,班级环境创设计划范文五篇
  17. Google是如何通过拆股增强控制权的?
  18. 钻石DIAMOND英语源于DIAMAUND钻石
  19. 使用标签〈base〉
  20. 各家博客比较——CSDN、博客园、简书、知乎专栏、Github Page、个人建站

热门文章

  1. Liferay7 BPM门户开发之11: Activiti工作流程开发的一些统一规则和实现原理(完整版)...
  2. GNU make 和 makefile
  3. Backbone的写类方式
  4. Cruise Control
  5. Mac hive 配置和安装
  6. linux_kernel下载网站
  7. java jni调用dll文件_Java通过jni调用动态链接库
  8. android 自定义键盘高度不对,NVUE 容器一旦设置了position且容器高度不能超过整屏,在安卓端就会被键盘遮挡...
  9. Python入门系列之字符编码
  10. 编程难学?3点解答你的疑惑