Favorite Donut(HDU 5442)最小表示法+二分
题目给出一个字符串,由a~z表示甜度,随字典序增大,字符串首尾相连形成一个圈,要求从一个位置开始字典序最大的字符串,输出位置以及是顺时针还是逆时针表示。顺时针用0表示,逆时针用1表示。
此题只需要查找字符串的最大字典序排列即可,模拟对字符串的翻转以及排列操作,可以用二分来查找位置来节省时间。
最小表示法模板:
- int getmin(char *s){
- int n=strlen(s);
- int i=,j=,k=,t;
- while(i<n && j<n && k<n){
- t=s[(i+k)%n]-s[(j+k)%n];
- if (!t) k++;
- else{
- if (t<) i+=k+;
- else j+=k+;
- if (i==j) j++;
- k=;
- }
- }
- return i<j?i:j;
- }
将t<0改为t>0即可求最大字典序。
- #include<cstdio>
- #include<cstring>
- #include<string>
- #include<algorithm>
- using namespace std;
- char input[],s[];
- int t,len;
- int getmin(char *s){
- int n=strlen(s);
- int i=,j=,k=,t;
- while(i<n && j<n && k<n){
- t=s[(i+k)%n]-s[(j+k)%n];
- if (!t) k++;
- else{
- if (t<) i+=k+;
- else j+=k+;
- if (i==j) j++;
- k=;
- }
- }
- return i<j?i:j;
- }
- int judge(int mid){
- int pos;
- for(int i=;i<len;i++)
- s[i]=input[(mid+i)%len];
- pos=getmin(s);
- if(pos>len--mid) return ;///
- else return ;
- }
- int main(){
- while(~scanf("%d",&t)){
- while(t--){
- scanf("%d%s",&len,input);
- char s1[],s2[];
- int start=getmin(input);
- for(int i=;i<len;i++)
- s1[i]=input[(start+i)%len];///从最小起点重构字符串
- reverse(input,input+len);///翻转字符串
- int start1=getmin(input);
- for(int i=;i<len;i++)
- s2[i]=input[(start1+i)%len];///从最小起点重构字符串
- if(strcmp(s1,s2)>)
- {printf("%d 0\n",start+);continue;}
- int l=start1,r=len-,mid;
- while(l<=r){
- mid=(l+r)/;
- if(judge(mid))
- l=mid+;
- else
- r=mid-;
- }
- start1=r;
- for(int i=;i<len;i++){
- s2[i]=input[(start1+i)%len];
- }
- if(strcmp(s1,s2)<){
- printf("%d 1\n",len-start1);continue;
- }
- else if(start<=len-start1){
- printf("%d 0\n",start+);
- }
- else printf("%d 1\n",len-start1);
- }
- }
- return ;
- }
Favorite Donut(HDU 5442)最小表示法+二分的更多相关文章
- HDU 2609 最小表示法
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2609 题意:给定n个循环链[串],问有多少个本质不同的链[串](如果一个循环链可以通过找一个起点使得和 ...
- HDU 4162 最小表示法
题目:http://acm.hdu.edu.cn/showproblem.php?pid=4162 题意:给定一个只有0-7数字组成的串.现在要由原串构造出一个新串,新串的构造方法:相邻2个位置的数字 ...
- String Problem hdu 3374 最小表示法加KMP的next数组
String Problem Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- Hdu 5442 Favorite Donut (2015 ACM/ICPC Asia Regional Changchun Online 最大最小表示法 + KMP)
题目链接: Hdu 5442 Favorite Donut 题目描述: 给出一个文本串,找出顺时针或者逆时针循环旋转后,字典序最大的那个字符串,字典序最大的字符串如果有多个,就输出下标最小的那个,如果 ...
- hdu 5442 Favorite Donut 后缀数组
Favorite Donut Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid ...
- HDU 3374 最小/大表示法+KMP
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3374 题意:给定一个串s,该串有strlen(s)个循环同构串,要求输出字典序最小的同构串的下标,字典 ...
- hdu String Problem(最小表示法入门题)
hdu 3374 String Problem 最小表示法 view code#include <iostream> #include <cstdio> #include &l ...
- HDU 4162 Shape Number(字符串,最小表示法)
HDU 4162 题意: 给一个数字串(length <= 300,000),数字由0~7构成,求出一阶差分码,然后输出与该差分码循环同构的最小字典序差分码. 思路: 第一步是将差分码求出:s[ ...
- HDU - 3374 String Problem (kmp求循环节+最大最小表示法)
做一个高产的菜鸡 传送门:HDU - 3374 题意:多组输入,给你一个字符串,求它最小和最大表示法出现的位置和次数. 题解:刚刚学会最大最小表示法,amazing.. 次数就是最小循环节循环的次数. ...
随机推荐
- 笨办法41学会说面向对象【pyinstaller安装使用
urllib库安装 先切换到pip所在目录 D:\Program Files\JetBrains\PyCharm 2017.3.3\untitled>cd /d c:\ c:\>cd c: ...
- Linux中一个文件10行内容,如何输出5-8内容到屏幕
题目是这样的,Linux中一个文件10行内容,如何输出5-8内容到屏幕首先我们模拟一下这样的环境: [root@localhost question]# pwd /root/question [roo ...
- Dubbo框架设计
各层说明 config配置层:对外配置接口,以 ServiceConfig, ReferenceConfig 为中心,可以直接初始化配置类,也可以通过 spring 解析配置生成配置类 proxy服务 ...
- vBox Arch UEFI LVM安装
Table of Contents 介绍 配置 基础 VirtualBox配置 安装准备 基础 分区 格式化 挂载 安装 选择镜像 安装基本系统 配置 fstab chroot 一些配置 lvm2 网 ...
- python 常用网站
https://www.tutorialgateway.org/python-tutorial/
- jsapi 调起微信支付的的踩坑
问题: 公众微信号调起微信支付的时候,有的时候调起支付成功,有的时候调起支付失败.利用抓包工具抓取数据显示授权和调用后台的微信预支付订单接口都成功并且都返回正确的数据.但是调起支付的时候传入的data ...
- 运维架构之httpd
Web Service 传输层:提供进程地址 Port number tcp:传输控制协议,面向连接,通信前需建立虚拟链路,结束后拆除:0-65535 udp:用户数据报协议,无连接:0-65535 ...
- linux - man 提示:No entry for tty in section 4 of the manual
在使用man手册时,出现空章节的情况: 如: 原因:在CentOS6.5安装时,采用了minimal方式安装,许多包都没有安装上,man手册的man-pages包也没有安装 解决方案:安装man-pa ...
- 非关系数据库一Memcached
第三十四课 非关系数据库一Memcached 目录 一.nosql介绍 二.memrcached介绍 三.安装memcached 四.查看memcachedq状态 五.memcached命令行 六.m ...
- 初读"Thinking in Java"读书笔记之第四章 ---控制执行流程
true和false Java不允许将数字作为布尔值使用. 所有条件表达式都将布尔值作为判断条件,决定执行路径. if-lese 迭代 while,do-while,for为三个迭代语句. ,逗号操作 ...