BZOJ 2882 & 后缀数组的傻逼实现
题意:
一个字符环,求一个开头使字典序最小.
SOL:
后缀数组打起来...然后居然卡过...10sec的实现我10936ms...居然卡过???
rank倒三...啦啦啦啦啦....
改个离散化会不会快点?....
Code:
/*==========================================================================
# Last modified: 2016-03-19 14:38
# Filename: 2882.cpp
# Description:
==========================================================================*/
#define me AcrossTheSky
#include <cstdio>
#include <cmath>
#include <ctime>
#include <string>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm> #include <set>
#include <map>
#include <stack>
#include <queue>
#include <vector> #define lowbit(x) (x)&(-x)
#define FOR(i,a,b) for((i)=(a);(i)<=(b);(i)++)
#define FORP(i,a,b) for(int i=(a);i<=(b);i++)
#define FORM(i,a,b) for(int i=(a);i>=(b);i--)
#define ls(a,b) (((a)+(b)) << 1)
#define rs(a,b) (((a)+(b)) >> 1)
#define getlc(a) ch[(a)][0]
#define getrc(a) ch[(a)][1] #define maxn 700000
#define maxm 100000
#define pi 3.1415926535898
#define _e 2.718281828459
#define INF 1070000000
using namespace std;
typedef long long ll;
typedef unsigned long long ull; template<class T> inline
void read(T& num) {
bool start=false,neg=false;
char c;
num=0;
while((c=getchar())!=EOF) {
if(c=='-') start=neg=true;
else if(c>='0' && c<='9') {
start=true;
num=num*10+c-'0';
} else if(start) break;
}
if(neg) num=-num;
}
/*==================split line==================*/
int s[maxn];
int t[maxn],t2[maxn],c[maxn],sa[maxn];
int n; void build_sa(int m){
int *x=t,*y=t2;
FORP(i,0,m) c[i]=0;
FORP(i,0,n-1) c[x[i]=s[i]]++;
FORP(i,1,m) c[i]+=c[i-1];
FORM(i,n-1,0) sa[--c[x[i]]]=i;
for (int k=1;k<=n;k <<= 1){
int p=0;
FORP(i,n-k,n-1) y[p++]=i;
FORP(i,0,n-1) if (sa[i]>=k) y[p++]=sa[i]-k; FORP(i,0,m) c[i]=0;
FORP(i,0,n-1) c[x[y[i]]]++;
FORP(i,1,m) c[i]+=c[i-1];
FORM(i,n-1,0) sa[--c[x[y[i]]]]=y[i]; swap(x,y);
p=1; x[sa[0]]=0;
FORP(i,1,n-1)
if (y[sa[i-1]]==y[sa[i]] && y[sa[i-1]+k]==y[sa[i]+k])
x[sa[i]]=p-1;
else x[sa[i]]=p++;
if (p>=n) break;
m=p;
}
}
int main(){
read(n); int tmp=n;
int m=0;
FORP(i,0,n-1) { read(s[i]); m=max(m,s[i]); s[n+i]=s[i];}
s[n+n]=m+1;
n=n+n+1;
build_sa(m+2);
for (int i=0;i<tmp;i++) printf("%d%c",s[(sa[0])%tmp+i],i==tmp-1?'\n':' ');
}
BZOJ 2882 & 后缀数组的傻逼实现的更多相关文章
- bzoj 3172 后缀数组|AC自动机
后缀数组或者AC自动机都可以,模板题. /************************************************************** Problem: 3172 Us ...
- bzoj 1301 后缀数组
比较裸的后缀数组. /************************************************************** Problem: User: BLADEVIL La ...
- BZOJ 3998 后缀数组
思路: 第一问 建出来后缀数组以后 前缀和一发n-sa[i]-ht[i]+1 二分 第二问 二分判断是带重复的第几 怎么判断呢 找到它 往后扫ht递减sum+=它 跟K判判 注意等于 加 ...
- BZOJ 3796 后缀数组+KMP
思路: 写得我头脑发蒙,,, 旁边还有俩唱歌的 抓狂 (感谢lh大爷查错) 首先 1.w是s1的子串 2.w是s2的子串 这两步很好办啊~ 后缀数组一下O(n)就可以搞 重点是 这个:3.s3不是w的 ...
- BZOJ 3230 后缀数组+ST
思路: 首先我们已经会了后缀数组求本质不同的子串个数 这道题跟那个差不多 首先我们可以知道按字典序排好的每个后缀之前包含多少本质不同的字串 就是sigma(n-sa[i]+1-ht[i]+bi[i-1 ...
- BZOJ 4516 后缀数组+ST+set
写了一半 没了啊啊啊 重新写的 思路: 先不考虑后缀自动机 (我不会啊) 那这道题只能用后缀数组了 先把原串倒一下 后缀->前缀 相当于每回在前面加了一个字母 求不同的子串个数 首先 正常的求子 ...
- BZOJ 4556(后缀数组+主席树求前驱后继+二分||后缀数组+二分+可持久化线段树)
换markdown写了.. 题意: 给你一个1e5的字符串,1e5组询问,求\([l_1,r_1]\)的所有子串与\([l_2,r_2]\)的lcp 思路: 首先可以发现答案是具有单调性的,我们考虑二 ...
- BZOJ 3238 后缀数组+单调栈
单调栈跑两遍求出来 ht[i]为最小值的那段区间 //By SiriusRen #include <cstdio> #include <cstring> #include &l ...
- 【BZOJ4566】找相同字符(后缀数组)
[BZOJ4566]找相同字符(后缀数组) 题面 BZOJ 题解 后缀数组的做法,应该不是很难想 首先看到两个不同的串,当然是接在一起求\(SA,height\) 那么,考虑一下暴力 在两个串各枚举一 ...
随机推荐
- React之JSX入门
React是由ReactJS与React Native组成,其中ReactJS是Facebook开源的一个前端框架,React Native 是ReactJS思想在native上的体现! JSX并不是 ...
- AJAX 汽车详细信息练习
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- Acdream 1111:LSS(水题,字符串处理)
LSS Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 128000/64000 KB (Java/Others) SubmitStati ...
- 攻城狮在路上(壹) Hibernate(十八)--- 管理Hibernate的缓存
一般Session的缓存被称为Hibernate的第一级缓存,SessionFactory的外置缓存是一个可配置的缓存插件,称为Hibernate的第二级缓存.一.缓存的基本原理: 1.持久化层的缓存 ...
- 2-05使用SQL语句创建数据库2
使用SQL语句创建多个数据文件和日志文件: USE master--指向当前使用的数据库 GO--批处理的标志 CREATE DATABASE E_Market--创建E_market数据库 ON P ...
- C# XML操作
一.简单介绍 using System.Xml; //初始化一个xml实例 XmlDocument xml=new XmlDocument(); //导入指定xml文件 xml.Load(path); ...
- [Linux][Hadoop] 将hadoop跑起来
前面安装过程待补充,安装完成hadoop安装之后,开始执行相关命令,让hadoop跑起来 使用命令启动所有服务: hadoop@ubuntu:/usr/local/gz/hadoop-$ ./sb ...
- 搜索 录音功能 Android api
搜索 录音功能 Android api http://www.oschina.net/android/47/ http://m.blog.csdn.net/blog/u011309801/406523 ...
- 编译器 expected unqualified-id before numeric constant 错误
今天调试代码,碰到expected unqualified-id before numeric constant 错误,代码的错误模块出现在一个函数模块上, 奇怪的是这个函数模块之前编译了很多次,也没 ...
- C++异常处理机制几种方法
一.异常 迄今为止,我们处理程序中的错误一般都是用if语句测试某个表达式,然后处理错误的特定义代码. C++异常机制使用了三个新的关键字 (SEH(结构化异常处理)) try ──标识可能出现 ...