博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU 3374 String Problem(最小最大表示法+KMP)
阅读量:4073 次
发布时间:2019-05-25

本文共 1086 字,大约阅读时间需要 3 分钟。

链接:

题目大意:

给定一个字符串S, 可以通过向左移位得到另一个字符串。例如,S="SKYLONG", 通过位移得到的所有字符串(后面的数字表示rank,即第几个):

SKYLONG 1
KYLONGS 2
YLONGSK 3
LONGSKY 4
ONGSKYL 5
NGSKYLO 6
GSKYLON 7

求出一个字符串经位移后的所有字符串中字典序最小和字典需最大的rank,以及他们出现的次数。

分析与总结:

经过分析,很快可以得到大概的思路:

1. 把S复制成2倍

2. 找出字典序最小和最大的字符串

3. 直接KMP求出他们的次数即可。

关键在于第二步。 第一次做时直接枚举,结果TLE了。势必要用一个效率更高的方法找到字典序最小和最大的字符串。

经过百度得知这个方法就是“最小最大表示法”。 

资料:

【浅析“最小表示法”思想在字符串循环同构问题中的应用--03 周源】:    

代码:

#include
#include
#include
#include
using namespace std;const int MAXN = 1000005;char S[MAXN*2];char first[MAXN];char last[MAXN];int rank_first, rank_last;int next[MAXN];void getNext(char* S,int* next){ int n=strlen(S); next[0]=next[1]=0; for(int i=1; i
>= 1; while(i
= len) break; if(S[i+k] > S[j+k]) i = max(i+k+1,j+1); else j = max(i+1,j+k+1); } int pos=min(i,j); rank_first=pos+1; for(int i=0; i
>= 1; while(i
= len) break; if(S[i+k] < S[j+k]) i = max(i+k+1,j+1); else j = max(i+1,j+k+1); } int pos=min(i,j); rank_last=pos+1; for(int i=0; i

 ——  生命的意义,在于赋予它意义士。

          原创  , By   D_Double  (转载请标明)


你可能感兴趣的文章
Eclipse中的文本编辑器使用技巧
查看>>
在 flash.text.TextField 上找不到属性 play,且没有默认值。
查看>>
ANDROID物联网开发
查看>>
安卓开发项目实战我的云音乐
查看>>
ANDROID物联网开发
查看>>
UE4高级运动系统(Advanced Locomotion System V3)插件分析
查看>>
尘封的记忆第2卷:Serekh塞拉赫资源包
查看>>
adb server version (39) doesn't match this client (40); killing...
查看>>
adb server version (39) doesn't match this client (40); killing...
查看>>
Unity高级游戏地编案例
查看>>
UE4地编大型开放世界~制作烘焙全流程
查看>>
TextMesh Pro不能显示中文的解决办法是创建字贴图,常用汉字3500
查看>>
permanently
查看>>
Unity2019游戏框架搭建第一季C# 核心知识与简易框架搭建 + Unity2019 游戏框架搭建第二季:UI 模块与资源模块持续精进...
查看>>
Unity发布到Google Play应用上架流程
查看>>
50 个 Chrome Developer Tools 必备技巧
查看>>
TextMesh Pro不能显示中文的解决办法是创建字贴图,常用汉字3500+特殊字符
查看>>
unity3d钢琴游戏完整项目源码
查看>>
Unity 2019 LTS正式推出
查看>>
关于UE4使用中虚幻商城保管库的目录问题
查看>>