题目给出一个字符串,由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)最小表示法+二分的更多相关文章

  1. HDU 2609 最小表示法

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2609 题意:给定n个循环链[串],问有多少个本质不同的链[串](如果一个循环链可以通过找一个起点使得和 ...

  2. HDU 4162 最小表示法

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=4162 题意:给定一个只有0-7数字组成的串.现在要由原串构造出一个新串,新串的构造方法:相邻2个位置的数字 ...

  3. String Problem hdu 3374 最小表示法加KMP的next数组

    String Problem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  4. Hdu 5442 Favorite Donut (2015 ACM/ICPC Asia Regional Changchun Online 最大最小表示法 + KMP)

    题目链接: Hdu 5442 Favorite Donut 题目描述: 给出一个文本串,找出顺时针或者逆时针循环旋转后,字典序最大的那个字符串,字典序最大的字符串如果有多个,就输出下标最小的那个,如果 ...

  5. hdu 5442 Favorite Donut 后缀数组

    Favorite Donut Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid ...

  6. HDU 3374 最小/大表示法+KMP

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3374 题意:给定一个串s,该串有strlen(s)个循环同构串,要求输出字典序最小的同构串的下标,字典 ...

  7. hdu String Problem(最小表示法入门题)

    hdu 3374 String Problem 最小表示法 view code#include <iostream> #include <cstdio> #include &l ...

  8. HDU 4162 Shape Number(字符串,最小表示法)

    HDU 4162 题意: 给一个数字串(length <= 300,000),数字由0~7构成,求出一阶差分码,然后输出与该差分码循环同构的最小字典序差分码. 思路: 第一步是将差分码求出:s[ ...

  9. HDU - 3374 String Problem (kmp求循环节+最大最小表示法)

    做一个高产的菜鸡 传送门:HDU - 3374 题意:多组输入,给你一个字符串,求它最小和最大表示法出现的位置和次数. 题解:刚刚学会最大最小表示法,amazing.. 次数就是最小循环节循环的次数. ...

随机推荐

  1. Spring-----AOP-----事务

    xml文件中: 手动处理事务: 设置数据源 <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooled ...

  2. nginx常用模块

    Nginx模块介绍 核心模块:core module 标准模块:stand modules HTTP modules: Standard HTTP modules Optional HTTP modu ...

  3. 进程pid理解

    PID(Process Identification)操作系统里指进程识别号,也就是进程标识符.操作系统里每打开一个程序都会创建一个进程ID,即PID.   PID(进程控制符)英文全称为Proces ...

  4. bean shell 中parameter传递参数的方法

    1.在csv set data config中添加用到的数据文件,并进行配置 2.在这一栏中,可以引入数据文件中的数据,用法如下${变量名},多个变量用空格隔开.在脚本中进行引用时,采用bsh.arg ...

  5. HIVE中IN的坑

    问题:为什么HIVE中用了 NOT IN,结果集没了? 注:这个是原创,转载请注明,谢谢!直接进实验室>> > select * from a;OK1 a12 a23 a3Time ...

  6. ESP系列MQTT数据通信

    1.使用一个深圳四博智联科技有限公司的NODEMCU开发板. 2.下载MQTT的SDK压缩包,请查看附件. 3.用官方提供的Eclipse打开MQTT的sdk开发包. 4.打开include文件夹中的 ...

  7. org.springframework.cloud FeignInterceptor

    package org.rx.feign; import org.apache.commons.lang3.ArrayUtils; import org.aspectj.lang.Proceeding ...

  8. mongo-2ds索引对超过半球范围的适用性测试

    以下测试均基于mongo v4.0 win10 一.GeoJSON GeoJSON是一种基于json的经纬度描述数据格式.在这里主要服务于2dsphere索引查询. 基本格式  <type:&q ...

  9. 如何在linux环境安装数据库

    1.1      获取oracle 数据库安装包: 注意:获取的是database的安装包,不是客户端的安装包 1.2      以root用户登陆云主机,修改主机名 Hostname 1.2.1   ...

  10. php的array数组 -------方法array_column()

    array_column($arr,'valColumn','keyColumn'); 此方法是用户二维数组,如下例子: $arr=array( array('id'=>1,'name'=> ...