最大表示法--环形字符串最大字典序(HDU 5442)
http://acm.hdu.edu.cn/showproblem.php?pid=5442
问题概述:n个字符围成一个环,请从这个环中找出字典序最大的长度为n的字符串,输出它的起始点和方向(0顺1
逆)如果有多个,输出起始点下标小的那个,如果下标相同,输出顺时针的
输入样例: 对应输出:
2 10 1
10 2 0
aaaaaaaakz
10
azazazazaz
环形字符串最大字典序:http://blog.csdn.net/zy691357966/article/details/39854359
求解问题:n个字符串围成一个环,请从这个环中找出字典序最大(或最小)的长度为n的字符串(下标尽可能小)
步骤:
①初始化i=1,j=2,len为字符环长度
②从k=0开始,检验str[i+k]与str[j+k]对应的字符是否相等,如果相等则k++,一直下去,如果k<len时找到了第一个不同,执行步骤③,如果k==len,执行步骤④
③若s[i+k]>s[j+k],则i滑动到i+k+1处,否则j滑动到j+k+1处,若移动完后i==j,则j++,继续执行步骤②,如果i或j有一个超过len,执行步骤④
④返回i和j小的那个,就是答案
技巧:将字符串完全复制一遍接在原字符串的后面,就可以模拟出一个环
此题题解:顺时针套模板,逆时针将字符串逆序再套一次模板,但是逆时针求出来的下标不是最小的反而是最大
的,需要跑一波KMP
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int net[52222];
int Getmax(int len, char str[]);
int main(void)
{int T, i, len, ans1, ans2, p, q, flag, temp;char st1[52222], st2[52222];scanf("%d", &T);while(T--){scanf("%d", &len);for(i=1;i<=len;i++){scanf(" %c", &st1[i]);st2[len-i+1] = st2[2*len-i+1] = st1[i];st1[i+len] = st1[i];}st1[len*2+1] = st2[len*2+1] = '\0';ans1 = Getmax(len, st1); /*顺时针套模板,计算出起始下标*/temp = ans2 = Getmax(len, st2); /*逆时针将字符串逆序再套一次模板,计算出起始下标(是最大的那个)*//* --KMP-- */p = ans2-1, q = ans2; /*将ans2设为起点*/memset(net, -1, sizeof(net));net[q] = p;flag = 0; /*标记逆时针字典序最大时下标是否唯一,flag==1表示不唯一*/while(q<=len*2){if(p==ans2-1 || st2[p]==st2[q]){p++, q++;net[q] = p;if(net[p]==ans2+len)net[q] = ans2+len, flag = 1; /*找到相同字符串,但下标更小!*/}elsep = net[p];}if(flag==1){for(q=2*len;q>=ans2+len;q--){if(net[q]==ans2+len){ans2 = 2*len-q+1;break;}}}elseans2 = len-ans2+1;st1[ans1+len] = st2[temp+len] = '\0';//puts(st1+ans1), puts(st2+temp);if(strcmp(st1+ans1, st2+temp)>0)printf("%d 0\n", ans1);else if(strcmp(st1+ans1, st2+temp)<0)printf("%d 1\n", ans2);else{if(ans1<=ans2)printf("%d 0\n", ans1);elseprintf("%d 1\n", ans2);}}return 0;
}int Getmax(int len, char str[])
{int i, j, k, temp;i = 1, j = 2, k = 0;while(i<=len && j<=len && k<=len){temp = str[i+k]-str[j+k];if(temp==0)k++;else{if(temp>0)j = max(j+k+1, i+1); /*可以直接j = j+k+1,下同*/elsei = max(i+k+1, j+1);if(i==j)j++;k = 0;}}if(i<=j)return i;return j;
}
最大表示法--环形字符串最大字典序(HDU 5442)相关推荐
- 【20190405】算法-输入一个字符串,按字典序打印出该字符串中字符的所有排列
方法一:利用递归 利用递归求全排列的过程真的很难理解,先把代码贴上来吧 function Permutation(str) {// write code hereif(!str){return str ...
- 牛客题霸 [拼接所有的字符串产生字典序最小的字符串] C++题解/答案
牛客题霸 [拼接所有的字符串产生字典序最小的字符串] C++题解/答案 题目描述 给定一个字符串的数组strs,请找到一种拼接顺序,使得所有的字符串拼接起来组成的字符串是所有可能性中字典序最小的,并返 ...
- leetcode1415. 长度为 n 的开心字符串中字典序第 k 小的字符串(回溯)
一个 「开心字符串」定义为:仅包含小写字母 ['a', 'b', 'c']. 对所有在 1 到 s.length - 1 之间的 i ,满足 s[i] != s[i + 1] (字符串的下标从 1 开 ...
- n个字符串按照字典序排列
题目描述 给定n个字符串,请对n个字符串按照字典序排列. 输入描述: 输入第一行为一个正整数n(1≤n≤1000),下面n行为n个字符串(字符串长度≤100),字符串中只含有大小写字母. 输出描述: ...
- js字符串的字典序_27. 字符串的排列
输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 输入描述: 输入一个字符 ...
- Java把科学计数法转换为字符串
为什么80%的码农都做不了架构师?>>> /*** 把科学计数法转换为字符串* 1.64607507E8(转化为164607507).1.6.0.0.0* @param str ...
- C语言编程>第二十三周 ③ 下列给定程序中,函数fun的功能是:利用插入排序法对字符串中的字符按从小到大的顺序进行排序。插入法的基本算法是:先对字符串中的头两个元素进行排序;然后把第三字符插入
例题:下列给定程序中,函数fun的功能是:利用插入排序法对字符串中的字符按从小到大的顺序进行排序.插入法的基本算法是:先对字符串中的头两个元素进行排序:然后把第三字符插入到前两个字符中,插入后前三个字 ...
- ①编写一个程序,从键盘接收一个字符串,然后按照字符顺序从小到大进行排序,并删除重复的字符。②集合A、B的差集③对分行输入的若干字符串按字典序(由小到大)进行排序并输出。
文章目录 ①编写一个程序,从键盘接收一个字符串,然后按照字符顺序从小到大进行排序,并删除重复的字符 ②集合A.B的差集 ③对分行输入的若干字符串按字典序(由小到大)进行排序并输出. ①编写一个程序,从 ...
- python 科学计数法 转 字符串表述
python 科学计数法 转 字符串表述 文章目录 python 科学计数法 转 字符串表述 前言: 需求: 代码: 前言: 好久没有写博客了,写一个今天需要的一个小玩意儿,网上没有找到一个方便的解决 ...
最新文章
- 如何在用户控件中操作页面中的控件?
- C语言工程代码查看神器 SourceInsight
- php basic syntax
- iis下的php不显示报错信息,IIS环境下 PHP无法显示错误信息怎么办
- Linux下获取CPUID、硬盘序列号与MAC地址
- Java面试常见各种概念区别比较
- C++中函数如何返回数组
- Direct3D9初始化-------VB6编程学习DX9游戏编程DirectX9编程2D小游戏源码冷风引擎CoolWind2D游戏引擎(6)
- 从校园到职场,你对前景很迷茫?
- 根据传入当前页码及每页数量进行查询
- Android禁止多点触控
- 51单片机程序存储器和数据存储器
- app对于接口返回数据的容错测试(健壮性测试)
- 北京市高等教育英语听力计算机考试,北京市2018年高考英语听力机考问答
- 15.7 项目:多线程 XKCD 下载程序
- 用OpenCV实现简单的泊松融合
- linux之进程观察命令:ps和top
- m蜂窝移动通信系统中越区切换的matlab仿真分析
- 图解AUTOSAR(六)——服务层(Service Layer)、复杂驱动(Complex Drivers)
- Unreal Engin_室外场景制作笔记_001创建森林地面
热门文章
- python自学行吗-python自学行吗 有哪些用处
- 传祺 GS4 和博越 PRO 不知道选谁?体验后的最真实的评价
- 有哪些能识别英文的语音助手?
- 一种多功能语音识别技术和音乐播放器相结合的方法
- 苹果充电线android头断了,苹果充电线又坏了?其实一招就能搞定!还不花1分钱......
- sql server php删除,使用 SQL Server 添加删除修改查询储存过程
- FFmpeg的H.264解码器源代码简单分析:宏块解码(Decode)部分-帧内宏块(Intra)
- matlab 释放变量,怎么能释放已经使用的内存
- think php union,UNION -ThinkPHP3.2.3完全开发手册 | AnSpoon.Com
- java适合年龄_Java实现三人年龄