HDU 4162 Shape Number
题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=4162
题意:
求给定字符的一阶差分链的最小表示。
题解:
先求一阶差分链,再求一阶差分链的最小表示法。
代码:
跑了670MS
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std; const int maxn = 3e5 + ; char s1[maxn],s2[maxn]; int solve(char *s) {
int i = , j = , k = ,len=strlen(s);
while (i < len&&j < len&&k<len) {
int t = s[(i + k) % len] - s[(j + k) % len];
if (!t) k++;
else {
if (t > ) i = i + k + ;
else j = j + k + ;
if (i == j) j++;
k = ;
}
}
return i < j ? i : j;
} int main() {
while (scanf("%s", s1) == ) {
int len = strlen(s1);
for (int i = ; i < len; i++) {
s2[i] = (s1[(i + ) % len] - s1[i] + ) % + '';
}
s2[len] = '\0';
//cout << s2 << endl;
int pos = solve(s2);
for (int i = ; i < len; i++) {
printf("%c", s2[(pos + i) % len]);
}
printf("\n");
}
return ;
}
贴个后缀数组的解法:
跑了2527MS
#include<map>
#include<cmath>
#include<queue>
#include<vector>
#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define X first
#define Y second
#define mkp make_pair
#define lson (o<<1)
#define rson ((o<<1)|1)
#define mid (l+(r-l)/2)
#define sz() size()
#define pb(v) push_back(v)
#define all(o) (o).begin(),(o).end()
#define clr(a,v) memset(a,v,sizeof(a))
#define bug(a) cout<<#a<<" = "<<a<<endl
#define rep(i,a,b) for(int i=a;i<(b);i++) typedef long long LL;
typedef vector<int> VI;
typedef pair<int,int> PII;
typedef vector<pair<int,int> > VPII; const int INF=0x3f3f3f3f;
const LL INFL=0x3f3f3f3f3f3f3f3fLL;
const double eps=1e-; const int maxn = 3e5 + ; char s1[maxn],s2[maxn]; struct SuffixArray{
char s[maxn];
int sa[maxn],t[maxn],t2[maxn],c[maxn];
int n,m;
void init(int n,int m){
this->n=n;
this->m=m;
}
void build_sa(){
int i,*x=t,*y=t2;
for(i=;i<m;i++) c[i]=;
for(i=;i<n;i++) c[x[i]=s[i]]++;
for(i=;i<m;i++) c[i]+=c[i-];
for(i=n-;i>=;i--) sa[--c[x[i]]]=i;
for(int k=;k<=n;k<<=){
int p=;
// for(i=n-k;i<n;i++) y[p++]=i;
// for(i=0;i<n;i++) if(sa[i]>=k) y[p++]=sa[i]-k;
for(i=;i<n;i++) y[p++]=(sa[i]-k+n)%n; for(i=;i<m;i++) c[i]=;
for(i=;i<n;i++) c[x[y[i]]]++;
for(i=;i<m;i++) c[i]+=c[i-];
for(i=n-;i>=;i--) sa[--c[x[y[i]]]]=y[i]; swap(x,y);
p=; x[sa[]]=;
for(i=;i<n;i++){
x[sa[i]]=y[sa[i-]]==y[sa[i]]&&y[sa[i-]+k]==y[sa[i]+k]?p-:p++;
}
if(p>=n) break;
m=p;
}
}
}mysa; int main() {
while (scanf("%s", s1) == ) {
int len = strlen(s1);
mysa.init(len,);
for (int i = ; i < len; i++) {
s2[i] = (s1[(i + ) % len] - s1[i] + ) % + '';
}
s2[len] = '\0';
strcpy(mysa.s,s2);
mysa.build_sa(); for(int p=mysa.sa[];p<mysa.sa[]+mysa.n;p++){
printf("%c",mysa.s[p%mysa.n]);
}
puts("");
}
return ;
}
HDU 4162 Shape Number的更多相关文章
- HDU 4162 Shape Number(字符串,最小表示法)
HDU 4162 题意: 给一个数字串(length <= 300,000),数字由0~7构成,求出一阶差分码,然后输出与该差分码循环同构的最小字典序差分码. 思路: 第一步是将差分码求出:s[ ...
- HDU 4162 Shape Number (最小表示法)
题意:给你一串n个数,求出循环来看一阶差的最小字典序:数字串看成一个顺时针的环,从某一点开始顺时针循环整个环,保证字典序最小就是答案 例如给你 2 1 3 就会得到(1-2+8 注意题意负数需要加8) ...
- hdu 4162 Shape Number 最小表示法
题目链接 给一个字符串, 将它想象成一个环, 然后从环中任意一个位置断开, 求断开后字典序最小的那种情况. 直接上模板.. #include <iostream> #include < ...
- 【HDOJ】4162 Shape Number
循环串的最小表示法. /* */ #include <iostream> #include <string> #include <map> #include < ...
- hdu 5898 odd-even number 数位DP
传送门:hdu 5898 odd-even number 思路:数位DP,套着数位DP的模板搞一发就可以了不过要注意前导0的处理,dp[pos][pre][status][ze] pos:当前处理的位 ...
- hdu 2665 Kth number
划分树 /* HDU 2665 Kth number 划分树 */ #include<stdio.h> #include<iostream> #include<strin ...
- hdu 4670 Cube number on a tree(点分治)
Cube number on a tree Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/ ...
- 主席树[可持久化线段树](hdu 2665 Kth number、SP 10628 Count on a tree、ZOJ 2112 Dynamic Rankings、codeforces 813E Army Creation、codeforces960F:Pathwalks )
在今天三黑(恶意评分刷上去的那种)两紫的智推中,突然出现了P3834 [模板]可持久化线段树 1(主席树)就突然有了不详的预感2333 果然...然后我gg了!被大佬虐了! hdu 2665 Kth ...
- HDU - 1711 A - Number Sequence(kmp
HDU - 1711 A - Number Sequence Given two sequences of numbers : a[1], a[2], ...... , a[N], and b[1 ...
随机推荐
- vs 2015密钥
专业版:HMGNV-WCYXV-X7G9W-YCX63-B98R2企业版:HM6NR-QXX7C-DFW2Y-8B82K-WTYJV
- Js判断CSS文件加载完毕的实例教程
要判断这个 CSS 文件是否加载完毕,各个浏览器的做法差异比较大,这次要说IE浏览器做的不错,我们可以直接通过onload方法来处理CSS加载完成以后的处理: 代码如下 复制代码 // 代码节选至se ...
- 大数阶乘(c语言)
大数阶乘.代码比较简单. #include<stdio.h> #include<string.h> #define MAXN 25000 // 如果你的阶乘N比较大,建议大一点 ...
- 【Unity3D】场景转换与退出
1.场景转换 : 老版本的场景切换用的是Application.LoadLevel([场景名字或者在File->Build settings里面的场景代号]); 新版本的场景转换用到了Scene ...
- Ajax_2
<script> var xmlHttp;//创建一个对象 function queryDetail(id){ if(window.ActiveXObject){ xmlHttp = ne ...
- 《JavaScript高级程序设计》心得笔记-----第二篇章
第五章 9.Function函数 1) 函数内部有两个特殊的对象: (1) arguments(主要用于保存函数参数,有一个属性callee,这是一个指针,指向拥有argu ...
- Java获取操作系统信息
今天在看jdk的demo时候发现java获取系统操作系统的一些信息,例如内存使用情况,于是自己也想研究研究! 百度一番,发现有2种方法! 1.sun自带的API 2.第三方jar(Sigar) 先 ...
- 2016.10.30 济南学习 Day2 下午 T1
他 [问题描述] 一张长度为N的纸带,我们可以从左至右编号为0 − N(纸带最左端标号为 0).现在有M次操作,每次将纸带沿着某个位置进行折叠,问所有操作之后纸带 的长度是多少. [输入格式] 第一行 ...
- The-ith-Element
Brief: the-ith-element,given a array A with n element , return the i-th element of A. A(n,i) this p ...
- qt QLabel 显示网络图片
在网上试了很多代码都不能使用,自己写了写代码. 直接上代码 Codevoid QMusicLogo::setNetworkPic(const QString &szUrl) { QUrl ur ...