题目:http://acm.hdu.edu.cn/showproblem.php?pid=4162

大意:原串通过相邻的数字相减得到的差或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 <cstring>using namespace std;

#define LL __int64

char c[333333], c1[333333];

//最小表示法int Minp(char *c, int l){int i = 0, j = 1, k = 0, t;while (i < l && j < l && k < l)    {        t = c[(i+k)%l] - c[(j+k)%l];if (t == 0)        {            k++;        }else        {

if (t > 0)//以i开头的串较大,所以i移动,j不变(因为求最小串的下标)            {                i += k + 1;            }else//i处小            {                j += k + 1;            }if (i == j)            {                j++;            }            k = 0;///        }    }return i < j ? i : j;}

int main(){int n;int i, j;int l, k;while (~scanf("%s", c))    {        l = strlen(c);for (i = 0; i < l; i++)        {            c1[i] = (c[(i+1)%l] >= c[i] ?  c[(i+1)%l] - c[i] + '0' : 8 - (c[i] - c[(i+1)%l]) + '0');        }//puts(c1);

        k = Minp(c1, l);

//cout << k << endl;        for (i = 0, j = k; i < l; i++, j = (j+1)%l)         {            printf("%c", c1[j]);        }        puts("");    }

return 0;}

转载于:https://www.cnblogs.com/qiufeihai/archive/2012/04/06/2434869.html

HDU 4162 Shape Number(最小表示法)相关推荐

  1. Shape Number (最小表示法)

    题目链接 一个字符串,这个字符串的首尾是连在一起的,要求寻找一个位置,以该位置为起点的字符串的字典序在所有的字符串中中最小. 1 #include <bits/stdc++.h> 2 us ...

  2. hdu 2609 How many(最小表示法)

    题目链接:hdu 2609 How many 题意: 给你一些01串,a能通过循环到b的算一个种类,问有多少种串. 题解: 最小表示法板子题. 1 #include<bits/stdc++.h& ...

  3. HDU - 3374 String Problem(最小表示法+最大表示法+KMP的next数组)

    题目链接:点击查看 题目大意:给出一个字符串,现在问字符串不断向左循环所能形成的n个字符串中,字典序最小和最大的字符串的编号为多少,分别有多少个 题目分析:字符串最小表示法的模板题,证明和模板都是看大 ...

  4. HDU - 3374(最小表示法+最大表示法)

    hdu3374 题意: 给你一个字符串,问这个字符串经过移动后的字典序最小的字符串的首字符位置和字典序最大的字符串的首字符的位置,和能出现多少次最小字典序的字符串和最大字典序的字符串 题解: 利用最小 ...

  5. 字符串循环同构的最小表示法(转)

    循环字符串的最小表示法的问题可以这样描述: 对于一个字符串S,求S的循环的同构字符串S'中字典序最小的一个. 由于语言能力有限,还是用实际例子来解释比较容易: 设S=bcad,且S'是S的循环同构的串 ...

  6. HDU 3826 Squarefree number:题目解答源码

    2019独角兽企业重金招聘Python工程师标准>>> HDU 3826 Squarefree number:题目解答源码 In mathematics,a squarefree n ...

  7. 2018.07.17 洛谷P1368 工艺(最小表示法)

    传送门 好的一道最小表示法的裸板,感觉跑起来贼快(写博客时评测速度洛谷第二),这里简单讲讲最小表示法的实现. 首先我们将数组复制一遍接到原数组队尾,然后维护左右指针分别表示两个即将进行比较的字符串的头 ...

  8. poj1509最小表示法

    题意:       给你一个循环串,然后找到一个位置,使得从这个位置开始的整个串字典序最小. 思路:       最小表示法的建档应用,最小表示法很好理解,就点贪心的意思,一开始我们枚举两个起点i,j ...

  9. hdu3374最小表示法+KMP

    题意:       给你一个最长100W的串,然后让你找到最小同构子串,还有最大同构子串的下标,最小同构子串就是把字符串连接成一个环,然后选择一个地方断开,得到的一个ASCII最小的子串(求最大同理) ...

最新文章

  1. 安装wrf模式的第一天
  2. 【大会】延迟还能再低点吗?不能,但也能
  3. 图文并茂重新认识下递归
  4. 虎牙AI基础技术部招聘深度学习/计算机视觉实习生
  5. WPF读写config配置文件
  6. 趋势:“无人化”的未来,这些事情你需要知道!
  7. python中execute函数_在excel中调用python函数
  8. PHP经常用到的方法,[PHP]经常用到的实用函数集合第1/2页
  9. Iocomp ActiveX/VCL Ultra Pack Crack
  10. 如何把电脑的计算机固定在桌面上,如何将Win7便签固定在电脑桌面上?
  11. html5兼容QQ浏览器,【QQ浏览器5.1】发布 HTML5兼容性测试
  12. Bat脚本 -(一)- echo/ echo off/ echo on/ @ / start / pause / rem
  13. 分享66个PHP聊天室类源码,总有一款适合您
  14. 【Python】初学者也可以实现的人脸识别系统-0x1
  15. html编写邮件发送_如何编写HTML电子邮件通讯
  16. 有了LIGO,引力波不仅可以被探测,还可以被发射!
  17. IE浏览器报错Unhandled promise rejection Error: 拒绝访问。文件流下载
  18. IP协议,ARP协议
  19. 优达学城机器学习之--支持向量机(SVM)
  20. 精简jre(JDK6瘦身)

热门文章

  1. HDOJ 1428 漫步校园
  2. 云服务器一直显示关机中,云服务器一直提示关机中
  3. 金山云html文件,金山云安全开放平台
  4. bind-utils.x86_64(dig) 安装失败解决办法
  5. 2019年湘潭大学程序设计竞赛(重现赛)补题:H.Chat(分组背包)
  6. 鹏博士和阿里云数据库产品达成战略合作,共赢企业数智化创新市场
  7. 有种欢迎叫“来了就是深圳人”
  8. 2021年中国云原生用户调查问卷
  9. 【开启报名】云原生变革与效能技术沙龙 · 厦门站
  10. 喝酒撸串聊技术!来看云栖大会15位大咖真人秀