HDU 4162

题意:

给一个数字串(length <= 300,000),数字由0~7构成,求出一阶差分码,然后输出与该差分码循环同构的最小字典序差分码。

思路:

第一步是将差分码求出:s[i] = (s[i] - s[i+1] + 8) % 8;

第二步是求出最小字典序的循环同构差分码,我之前没注意到字符串规模。

。直接用set做,MLE+TLE。。。

正确的方式应该是一种O(n)的解法。即最小表示法。

//关于最小表示法的证明与详述请參考最小表示法:)

最小表示法算法:

初始时,i=0,j=1,分别以i,j。为起始点顺着i,j,往下比較直到找的str[i+k]!=str[j+k],然后分两种情况考虑:

1、  str[i+k]>str[j+k],i变成i=i+k+1。j不变,然后继续往下比較。

2、  str[i+k]<str[j+k],j变成j=j+k+1。i不变,然后继续往下比較。

直到i或j大于串长。找较小者。

最小表示法的实现代码是这种:

  1. /*s表示字符串,l表示字符串长度,输出最小字符串起始位置*/
  2. int MinimumRepresentation(char *s, int l)
  3. {
  4. int i = 0, j = 1, k = 0, t;
  5. while(i < l && j < l && k < l) {
  6. t = s[(i + k) >= l ?
  7.  
  8. i + k - l : i + k] - s[(j + k) >= l ?
  9.  
  10. j + k - l : j + k];
  11. if(!t) k++;
  12. else{
  13. if(t > 0) i = i + k + 1;
  14. else j = j + k + 1;
  15. if(i == j) ++ j;
  16. k = 0;
  17. }
  18. }
  19. return (i < j ? i : j);
  20. }

AC code:(这次代码写的太丑啦。。)

  1. /*
  2. * @author Novicer
  3. * language : C++/C
  4. */
  5. #include<iostream>
  6. #include<sstream>
  7. #include<fstream>
  8. #include<vector>
  9. #include<list>
  10. #include<deque>
  11. #include<queue>
  12. #include<stack>
  13. #include<map>
  14. #include<set>
  15. #include<bitset>
  16. #include<algorithm>
  17. #include<cstdio>
  18. #include<cstdlib>
  19. #include<cstring>
  20. #include<cctype>
  21. #include<cmath>
  22. #include<ctime>
  23. #include<iomanip>
  24. using namespace std;
  25. const double eps(1e-8);
  26. typedef long long lint;
  27.  
  28. string s;
  29. set<string>ss;
  30.  
  31. int main(){
  32. // freopen("input.txt","r",stdin);
  33. while(cin >> s) {
  34. // cout << s << endl;
  35. ss.clear();
  36. int len = s.length();
  37. char tmp = s[0];
  38. set<string>:: iterator it;
  39. for(int i = 0 ; i < len - 1; i++){
  40. if(s[i] > s[i+1])
  41. s[i] = 8 - (s[i] - s[i+1]) + '0';
  42. else s[i] = s[i+1] - s[i] + '0';
  43. // cout << s[i] << ' ';
  44. }
  45. s[len-1] = (s[len-1]>tmp)? (8 - s[len-1] + tmp + '0') : (tmp - s[len-1] + '0');
  46. // cout << s << endl;
  47. int i = 0 , j = 1 , k = 0 , t;
  48. while(i < len && j < len && k < len){
  49. t = s[(i+k)] - s[(j+k)];
  50. if(t == 0) k++;
  51. else if(t > 0) i += k + 1;
  52. else if(t < 0) j += k + 1;
  53. if(t) k = 0;
  54. if(i == j) j++;
  55. }
  56. int pos = min(i,j);
  57. // cout << pos << endl;
  58. for(int i = 0 ; i < len ; i++)
  59. putchar(s[(i+pos) % len]);
  60. cout << endl;
  61.  
  62. // cout << s << endl;
  63.  
  64. s.clear();
  65. }
  66. return 0;
  67. }

HDU 4162 Shape Number(字符串,最小表示法)的更多相关文章

  1. HDU 4162 Shape Number (最小表示法)

    题意:给你一串n个数,求出循环来看一阶差的最小字典序:数字串看成一个顺时针的环,从某一点开始顺时针循环整个环,保证字典序最小就是答案 例如给你 2 1 3 就会得到(1-2+8 注意题意负数需要加8) ...

  2. HDU 4162 Shape Number

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4162 题意: 求给定字符的一阶差分链的最小表示. 题解: 先求一阶差分链,再求一阶差分链的最小表示法 ...

  3. hdu 4162 Shape Number 最小表示法

    题目链接 给一个字符串, 将它想象成一个环, 然后从环中任意一个位置断开, 求断开后字典序最小的那种情况. 直接上模板.. #include <iostream> #include < ...

  4. [coj 1353 Guessing the Number]kmp,字符串最小表示法

    题意:给一个字符串,求它的最小子串,使得原串是通过它重复得到的字符串的一个子串. 思路:先求最小长度,最小循环长度可以利用kmp的next数组快速得到,求出长度后然后利用字符串最小表示法求循环节的最小 ...

  5. 牛客练习赛36 A Rabbit的字符串(字符串最小表示法)

    链接:https://ac.nowcoder.com/acm/contest/328/A来源:牛客网 题目描述 Rabbit得到了一个字符串,她的好朋友xxx可以给这个字符串施加一次魔法. 魔法可以选 ...

  6. bzoj2176 Strange string(字符串最小表示法)

    Time Limit: 10 Sec  Memory Limit: 259 MB 给定一个字符串S = {S1, S2, S3 … Sn}, 如果在串SS中, 子串T(|T| = n)为所有长度为n的 ...

  7. hdu 3374 String Problem(kmp+最小表示法)

    Problem Description Give you a string with length N, you can generate N strings by left shifts. For ...

  8. BZOJ1398: Vijos1382寻找主人 Necklace 字符串最小表示法

    Description 给定两个项链的表示,判断他们是否可能是一条项链. Input 输入文件只有两行,每行一个由0至9组成的字符串,描述一个项链的表示(保证项链的长度是相等的). Output 如果 ...

  9. POJ 1509 Glass Beads【字符串最小表示法】

    题目链接: http://poj.org/problem?id=1509 题意: 求循环字符串的最小表示. 分析: 浅析"最小表示法"思想在字符串循环同构问题中的应用 判断两字符串 ...

随机推荐

  1. Maven快速使用阿里云的代理maven仓库

    自从开源中国的maven仓库挂了之后就一直在用国外的仓库,慢得想要砸电脑的心都有了.如果你和我一样受够了国外maven仓库的龟速下载?快试试阿里云提供的maven仓库,从此不在浪费生命…… 仓库地址: ...

  2. ASP.NET没有魔法——ASP.NET MVC 过滤器(Filter)

    上一篇文章介绍了使用Authorize特性实现了ASP.NET MVC中针对Controller或者Action的授权功能,实际上这个特性是MVC功能的一部分,被称为过滤器(Filter),它是一种面 ...

  3. CentOS 6.4安装配置LNMP服务器(Nginx+PHP+MySQL)

    一 安装篇 1. 安装nginx yum check-update #更新yum源 yum remove httpd* php* #删除系统自带的软件包 yum install nginx #安装ng ...

  4. 系统学习DOM事件机制

    本文将从以下几个方面介绍DOM事件: 基本概念:DOM事件的级别 DOM事件模型,事件流 描述DOM事件捕获的具体流程 Event对象的常见应用 自定义事件 DOM事件的级别 //DOM0 eleme ...

  5. mac 安装protobuf,并编译

    因公司接口协议是PB文件,需要将 PB 编译成JAVA文件,且MAC 电脑,故整理并分享MAC安装 google 下的protobuf 文件   MAC 安装protobuf 流程 1.下载 http ...

  6. Python爬虫知识点四--scrapy框架

    一.scrapy结构数据 解释: 1.名词解析: o 引擎(Scrapy Engine)o 调度器(Scheduler)o 下载器(Downloader)o 蜘蛛(Spiders)o 项目管 ...

  7. 解决thymeleaf layout布局不生效

    今天使用thymeleaf layout布局时总是不生效,特此把解决问题的步骤和几个关键点记录下来备忘. 一.检查依赖 1.thymeleaf必备maven依赖: <dependency> ...

  8. redis配置文件之复制

    主从复制使用slaveof将Redis实例作为另一个Redis服务器的副本. 1) Redis复制是异步的,master可以配置成如果它连接的slave没有达到给定的数量,就停止接受写入.2) 如果断 ...

  9. 晓莲说-何不原创:如何通过jad把class批量反编译成java文件

    背景:前几天在项目开发的时候遇到一个问题,那就是利用myeclipse编写好的一个项目打包成jar包后上传部署到服务器里,之后本地的项目被自己改来改去出现了一些问题,想着把上传到服务器里面的war包下 ...

  10. 【原创】python基于大数据现实双色球预测

    前提准备:利用sql筛选出每个球出现概率最高的前5个数 原理:先爬出所有的历史数据,然后模拟摇奖机出球的机制并大量模拟计算,直到出现列表中的某一个数后即停 注意事项:由于计算过程数据量很大,需要加入内 ...