【BZOJ】1692: [Usaco2007 Dec]队列变换
【算法】字符串hash
【题解】
显然如果字母互不相同,贪心取是正确的。
如果存在字母相同,那么就换成比较后缀和前缀嘛。
但是要注意,不是后缀和前缀相同就能直接跳跃,每次必须只推一位。
取模的哈希比自然溢出慢了好多。
#include<cstdio>
#include<algorithm>
#include<cstring>
#define ll long long
using namespace std;
const int maxn=,MOD=,base=;
ll sum1[maxn],sum2[maxn],p[maxn];
int n;
char c,s[maxn];
int calc1(int L,int R){return (sum1[R]+MOD-sum1[L-]*p[R-L+]%MOD)%MOD;}
int calc2(int L,int R){return (sum2[L]+MOD-sum2[R+]*p[R-L+]%MOD)%MOD;}
bool big(int L,int R){
if(s[L]!=s[R])return s[L]>=s[R];
int l=,r=R-L+;
while(l<r){
int mid=(l+r)>>;
if(calc1(L,L+mid-)==calc2(R-mid+,R))l=mid+;
else r=mid;
}
return s[L+l-]>=s[R-l+];
}
int main(){
scanf("%d",&n);
for(int i=;i<=n;i++){
c=getchar();
while(c<'A'||c>'Z')c=getchar();
s[i]=c;
}
p[]=;
for(int i=;i<=n;i++)p[i]=p[i-]*base%MOD;
for(int i=;i<=n;i++)sum1[i]=(sum1[i-]*base+s[i]-'A')%MOD;
for(int i=n;i>=;i--)sum2[i]=(sum2[i+]*base+s[i]-'A')%MOD;
int L=,R=n;
for(int i=,j=;i<=n;i++,j++){
if(!big(L,R)){
putchar(s[L++]);
}
else{
putchar(s[R--]);
}
if(j==)putchar('\n'),j=;
}
return ;
}
【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]队列变换
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=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 ...
随机推荐
- 【面试题】2018年最全Java面试通关秘籍第五套!
[面试题]2018年最全Java面试通关秘籍第五套! 原创 2018-04-26 徐刘根 Java后端技术 第一套:<2018年最全Java面试通关秘籍第一套!> 第二套:<2018 ...
- 超强排序JavaScript插件
Sortable:http://rubaxa.github.io/Sortable/
- Android系统自带样式
android:theme="@android:style/Theme.Dialog" 将一个Activity显示为能话框模式 android:theme="@andr ...
- hdu1505City Game(动态规划)
City Game Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total S ...
- 初探 Qt Opengl【2】
最近在研究QOPengl QGraphicsView QGraphicsItemQGraphicsScene不过也只是皮毛,也不是做什么技术贴,就是记录一下自己在其中遇到的问题,和自己新学到的东西. ...
- drf 缓存扩展
drf缓存给了一个非常方便的扩展,使用起来相当方便 1- 安装 pip install drf-extensions 2-配置 在settings里面增加两项配置 # drf扩展REST_FRAM ...
- Halcon环境搭建
1.Visual Studio 2017安装教程 2.Qt5.9安装教程 3.VS2017中Qt插件安装教程
- npm无法安装全局web3的问题
- 给Python初学者的一些编程建议
Python是一种非常富有表现力的语言.它为我们提供了一个庞大的标准库和许多内置模块,帮助我们快速完成工作.然而,许多人可能会迷失在它提供的功能中,不能充分利用标准库,过度重视单行脚本,以及误解Pyt ...
- lintcode-49-字符大小写排序
49-字符大小写排序 给定一个只包含字母的字符串,按照先小写字母后大写字母的顺序进行排序. 注意事项 小写字母或者大写字母他们之间不一定要保持在原始字符串中的相对位置. 样例 给出"abAc ...