HDU4162 Shape Number 最小表示法
来源:互联网 发布:吸入麻醉药mac值表 编辑:程序博客网 时间:2024/06/05 06:10
题意:此题是将序列都减去前面的数如果小于0就+8然后求按最小字典序不改变序列原序的情况下输出用最小表示法做
这里用到最小表示法:其维护i和j指针,分别指向(共有L(串长)个串)其中2个串(其实只有一个串,拆成2个串好理解点)的串头(注意当比较这两个串的大小的时候i和j都不动,任然指串头,而这个串头是指以该位置开始而得到的串的串头),他是通过k(因为如果不引入k,而i和j是移动的,比较完成后i和j回不了串头)来比较这两个串,即i+k和j+k就是比较这两个串时的指针。。。。。。。
然后,当不相等的时候,因为我们求的是最小的串,所以要移动大的指针,而小的指针不动,而这个小的指针很有可能就是我们所想要求的指针。。。。而移动的幅度是k+1使效率大大提高。。。。。因为如果移到[大指针后.....k]中的一个的话,
以这个位置为开头的串也一定比小串大。。。。。注意一点,i或j指的位置都可能是想求的位置。。。。。。
总之,求最小表示,就小的不变,求最大表示就大不变。。。。。
还有一点,就是始终保持i<j,因为如果i == j的话事实上就在比较同一个串。。。。没意义,而最后返回的就是i == j时
的指针,而这个指针极小可能是想要的结果。。。。。最后为什么返回小的那个呢?因为到达该位置就不在动了。。
而另外一个指针已经后移到出界了(即该指针 == L)
#include<iostream>#include <aLgorithm>#include <cstdLib>using namespace std;int Len;char a[300100];char b[300100]; int MinimumRepresentation(char *s,int L)//串s[0~L-1]的最小表示位置 { int i = 0, j = 1, k = 0,t; while (i +k< L && j+k < L && k < L)//找不到比它还小的 或者 完全匹配 { t = s[(i+k)%L] - s[(j+k)%L]; //if (s[(i+k) >= L ? i+k-L : i+k] == s[(j+k) >= L ? j+k-L : j+k]) if (t == 0) k++;//相等的话,检测长度加1 eLse { if (t > 0)//大于的话,s[i]为首的肯定不是最小表示,最大表示就改< i += k + 1; eLse j += k + 1; if (i == j) j++; k = 0; } } return i; }int main(){ while(~scanf("%s",&a)) { int s1=0; int Lena=strLen(a); for(int i=0;i<Lena;i++) { if(a[(i+1)%Lena]>=a[i]) b[i]=a[(i+1)%Lena]-a[i]+'0'; eLse b[i]=8-(a[i]-a[(i+1)%Lena])+'0'; } int pos=0; pos=MinimumRepresentation(b,Lena); for(int z=0;z<Lena;z++) { printf("%c",b[(pos+z)%Lena]); } puts(""); } return 0;}
- HDU4162 Shape Number 最小表示法
- HDU4162 Shape Number(最小表示法)
- hdu4162(最小表示法)
- HDU4162 Shape Number
- 【最小表示法】HDU-4162-Shape Number
- HDU 4162 Shape Number 最小表示法
- HDU 4162 Shape Number(最小表示法)
- HDOJ 4162 Shape Number(最小表示法 )
- TOJ 3771 HDU 4162 Shape Number / 最小表示法
- hdu 4162 Shape Number(最小表示法)
- HDU 4162 Shape Number(字符串,最小表示法)
- 【HDU 4162】Shape Number(一阶差分链码+最小表示法)
- HDU NO.4162 Shape Number(最小表示法循环输出字符串)
- hdu 4162 Shape Number【循环字符串最小表示法】模板学习
- 【最小表示法】HDU4162Shape Number
- HDU——4162Shape Number(字符串的最小表示)
- 最小表示法
- poj1509(最小表示法)
- poj 3467 Cross Counting
- JSONCPP
- code::blocks不能调试的可能原因
- 线段树HDU 2852
- MVP模式与MVC模式
- HDU4162 Shape Number 最小表示法
- Windows Vista Sample Credential Providers Overview 中文翻译
- (转)QQ截图时窗口自动识别的原理
- 动态规划 斜率优化
- RVM中文使用指南
- 对于Retain和Assign属性的理解(转)
- 共享池的改进与ORA-04031的变化(eygle)
- 第四届全国职工职业技能大赛维修电工、计算机程序设计员决赛在成都市举行
- VS2008设置程序默认启动为IIS