HDU 4162 Shape Number(字符串,最小表示法)
题意:
给一个数字串(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大于串长。找较小者。
最小表示法的实现代码是这种:
- /*s表示字符串,l表示字符串长度,输出最小字符串起始位置*/
- int MinimumRepresentation(char *s, int l)
- {
- int i = 0, j = 1, k = 0, t;
- while(i < l && j < l && k < l) {
- t = s[(i + k) >= l ?
- i + k - l : i + k] - s[(j + k) >= l ?
- j + k - l : j + k];
- if(!t) k++;
- else{
- if(t > 0) i = i + k + 1;
- else j = j + k + 1;
- if(i == j) ++ j;
- k = 0;
- }
- }
- return (i < j ? i : j);
- }
AC code:(这次代码写的太丑啦。。)
- /*
- * @author Novicer
- * language : C++/C
- */
- #include<iostream>
- #include<sstream>
- #include<fstream>
- #include<vector>
- #include<list>
- #include<deque>
- #include<queue>
- #include<stack>
- #include<map>
- #include<set>
- #include<bitset>
- #include<algorithm>
- #include<cstdio>
- #include<cstdlib>
- #include<cstring>
- #include<cctype>
- #include<cmath>
- #include<ctime>
- #include<iomanip>
- using namespace std;
- const double eps(1e-8);
- typedef long long lint;
- string s;
- set<string>ss;
- int main(){
- // freopen("input.txt","r",stdin);
- while(cin >> s) {
- // cout << s << endl;
- ss.clear();
- int len = s.length();
- char tmp = s[0];
- set<string>:: iterator it;
- for(int i = 0 ; i < len - 1; i++){
- if(s[i] > s[i+1])
- s[i] = 8 - (s[i] - s[i+1]) + '0';
- else s[i] = s[i+1] - s[i] + '0';
- // cout << s[i] << ' ';
- }
- s[len-1] = (s[len-1]>tmp)? (8 - s[len-1] + tmp + '0') : (tmp - s[len-1] + '0');
- // cout << s << endl;
- int i = 0 , j = 1 , k = 0 , t;
- while(i < len && j < len && k < len){
- t = s[(i+k)] - s[(j+k)];
- if(t == 0) k++;
- else if(t > 0) i += k + 1;
- else if(t < 0) j += k + 1;
- if(t) k = 0;
- if(i == j) j++;
- }
- int pos = min(i,j);
- // cout << pos << endl;
- for(int i = 0 ; i < len ; i++)
- putchar(s[(i+pos) % len]);
- cout << endl;
- // cout << s << endl;
- s.clear();
- }
- return 0;
- }
HDU 4162 Shape Number(字符串,最小表示法)的更多相关文章
- HDU 4162 Shape Number (最小表示法)
题意:给你一串n个数,求出循环来看一阶差的最小字典序:数字串看成一个顺时针的环,从某一点开始顺时针循环整个环,保证字典序最小就是答案 例如给你 2 1 3 就会得到(1-2+8 注意题意负数需要加8) ...
- HDU 4162 Shape Number
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4162 题意: 求给定字符的一阶差分链的最小表示. 题解: 先求一阶差分链,再求一阶差分链的最小表示法 ...
- hdu 4162 Shape Number 最小表示法
题目链接 给一个字符串, 将它想象成一个环, 然后从环中任意一个位置断开, 求断开后字典序最小的那种情况. 直接上模板.. #include <iostream> #include < ...
- [coj 1353 Guessing the Number]kmp,字符串最小表示法
题意:给一个字符串,求它的最小子串,使得原串是通过它重复得到的字符串的一个子串. 思路:先求最小长度,最小循环长度可以利用kmp的next数组快速得到,求出长度后然后利用字符串最小表示法求循环节的最小 ...
- 牛客练习赛36 A Rabbit的字符串(字符串最小表示法)
链接:https://ac.nowcoder.com/acm/contest/328/A来源:牛客网 题目描述 Rabbit得到了一个字符串,她的好朋友xxx可以给这个字符串施加一次魔法. 魔法可以选 ...
- bzoj2176 Strange string(字符串最小表示法)
Time Limit: 10 Sec Memory Limit: 259 MB 给定一个字符串S = {S1, S2, S3 … Sn}, 如果在串SS中, 子串T(|T| = n)为所有长度为n的 ...
- hdu 3374 String Problem(kmp+最小表示法)
Problem Description Give you a string with length N, you can generate N strings by left shifts. For ...
- BZOJ1398: Vijos1382寻找主人 Necklace 字符串最小表示法
Description 给定两个项链的表示,判断他们是否可能是一条项链. Input 输入文件只有两行,每行一个由0至9组成的字符串,描述一个项链的表示(保证项链的长度是相等的). Output 如果 ...
- POJ 1509 Glass Beads【字符串最小表示法】
题目链接: http://poj.org/problem?id=1509 题意: 求循环字符串的最小表示. 分析: 浅析"最小表示法"思想在字符串循环同构问题中的应用 判断两字符串 ...
随机推荐
- Maven快速使用阿里云的代理maven仓库
自从开源中国的maven仓库挂了之后就一直在用国外的仓库,慢得想要砸电脑的心都有了.如果你和我一样受够了国外maven仓库的龟速下载?快试试阿里云提供的maven仓库,从此不在浪费生命…… 仓库地址: ...
- ASP.NET没有魔法——ASP.NET MVC 过滤器(Filter)
上一篇文章介绍了使用Authorize特性实现了ASP.NET MVC中针对Controller或者Action的授权功能,实际上这个特性是MVC功能的一部分,被称为过滤器(Filter),它是一种面 ...
- CentOS 6.4安装配置LNMP服务器(Nginx+PHP+MySQL)
一 安装篇 1. 安装nginx yum check-update #更新yum源 yum remove httpd* php* #删除系统自带的软件包 yum install nginx #安装ng ...
- 系统学习DOM事件机制
本文将从以下几个方面介绍DOM事件: 基本概念:DOM事件的级别 DOM事件模型,事件流 描述DOM事件捕获的具体流程 Event对象的常见应用 自定义事件 DOM事件的级别 //DOM0 eleme ...
- mac 安装protobuf,并编译
因公司接口协议是PB文件,需要将 PB 编译成JAVA文件,且MAC 电脑,故整理并分享MAC安装 google 下的protobuf 文件 MAC 安装protobuf 流程 1.下载 http ...
- Python爬虫知识点四--scrapy框架
一.scrapy结构数据 解释: 1.名词解析: o 引擎(Scrapy Engine)o 调度器(Scheduler)o 下载器(Downloader)o 蜘蛛(Spiders)o 项目管 ...
- 解决thymeleaf layout布局不生效
今天使用thymeleaf layout布局时总是不生效,特此把解决问题的步骤和几个关键点记录下来备忘. 一.检查依赖 1.thymeleaf必备maven依赖: <dependency> ...
- redis配置文件之复制
主从复制使用slaveof将Redis实例作为另一个Redis服务器的副本. 1) Redis复制是异步的,master可以配置成如果它连接的slave没有达到给定的数量,就停止接受写入.2) 如果断 ...
- 晓莲说-何不原创:如何通过jad把class批量反编译成java文件
背景:前几天在项目开发的时候遇到一个问题,那就是利用myeclipse编写好的一个项目打包成jar包后上传部署到服务器里,之后本地的项目被自己改来改去出现了一些问题,想着把上传到服务器里面的war包下 ...
- 【原创】python基于大数据现实双色球预测
前提准备:利用sql筛选出每个球出现概率最高的前5个数 原理:先爬出所有的历史数据,然后模拟摇奖机出球的机制并大量模拟计算,直到出现列表中的某一个数后即停 注意事项:由于计算过程数据量很大,需要加入内 ...