sone2(未完成)
先留个半完成代码
边看论文边看题解写的...难受..
#include<cstdio>
#include<cstring>
namespace utils{
inline int max(int a,int b){ return a>b?a:b; }
inline int min(int a,int b){ return a<b?a:b; }
inline void tensen(int&a,int b){ if(a>b)a=b; }
inline void relax(int&a,int b){ if(a<b)a=b; }
///Trivial helping functions
inline int l2f(int n){
float a(n);
return (((*(int*)&a)>>23)+1)&31;//float provides 23-bit accuracy, enough for RQM-use
}
inline void swap(int&a,int&b){ a^=(b^=(a^=b)); }
}using namespace utils;
namespace qio{ //Code Tricks: quick I/O (collapsed) namespace used.
#define maxio 5000010
char buf[maxio],*cur,*ecr;
char obuf[maxio],*ocr;
inline void readin(){ ecr=(cur=buf)+fread(buf,1,maxio,stdin); ocr=obuf; }
inline int nxtint(){
while(*cur<'0' || *cur>'9')++cur;
int x=*(cur++)-'0'; while(*cur<='9'&&*cur>='0') x=x*10+*(cur++)-'0';
return x;
}
inline void print(int n){
if(n>=10) print(n/10),*(ocr++)=n%10+'0'; else *(ocr++)=n+'0';
}
inline void flush(){ fwrite(obuf,1,ocr-obuf,stdout); ocr=obuf; }
#define putc(x) (*(ocr++)=x)
#define getc(x) (x=*(cur++))
#define scanner qio
}using namespace qio;
#define Rx nxtint()
struct rmq_st{ //A trivial Objective-Range Minimun Query Solver involves a Sparse Table
#define maxn 100010
#define lmaxn 18
int sttbl[lmaxn][maxn];
inline void init(int n,int*v){
int*p=sttbl[0],*q;
for(int i=0;i<n;++i) p[i]=v[i];
for(int i=1,h=1,j=2;j<n;++i,h<<=1,j<<=1){
q=sttbl[i-1];
p=sttbl[i];
for(int k=0,_=n-j;k<=_;++k){
p[k]=min(q[k],q[k+h]);
}
}
}
inline int operator()(int l,int r){
int p=l-r+1,t=l2f(p);
return min(sttbl[t][l],sttbl[t][r-(1<<t)+1]);
}
#undef maxn
#undef lmaxn
};
typedef struct Suffix_Array{
#define maxn 100010
int v[maxn*3],qa[maxn*3],qb[maxn*3],sav[maxn*3],sa[maxn*3];
inline bool cmp1(int*v,int a,int b){
return v[a]==v[b] && v[a+1]==v[b+1] && v[a+2]==v[b+2];
}
inline bool cmp21(int*v,int a,int b){
return v[a]<v[b] || (v[a]==v[b] && sav[a+1]<sav[b+1]);
}
inline bool cmp2(int d,int*v,int a,int b){
if(d==1){
return cmp21(v,a,b);
}else{
return v[a]<v[b] || (v[a]==v[b] && cmp21(v,a+1,b+1));
}
}
inline void radixsort(int*v,int*q,int*sa,int n,int m){
static int c[maxn];
for(int i=0;i<m;++i)c[i]=0;
for(int i=0;i<n;++i)++c[v[q[i]]];
for(int i=1;i<m;++i)c[i]+=c[i-1];
for(int i=n-1;~i;--i)sa[--c[v[q[i]]]]=q[i];
}
#define f(x) (qx=(x)/3,qxa=qx*3,(x)-qxa==1?qx:qx+na)
#define rf(x) ((x)<na?3*(x)+1:3*((x)-na)+2)
inline void dc3(int*v,int*sa,int n,int m){
int i,j,k,*nv=v+n+3,*nsa=sa+n+3,na=(n+2)/3,nbc=0,lab;
int qx,qxa;
v[n]=v[n+1]=v[n+2]=0;
for(int i=0;i<n;++i)if(i%3)qa[nbc++]=i;
if(n%3==1) qa[nbc++]=n;
radixsort(v+2,qa,qb,nbc,m);
radixsort(v+1,qb,qa,nbc,m);
radixsort(v ,qa,qb,nbc,m);
for(i=lab=0;i<nbc;++lab,i=j+1){
for(j=i;j<nbc-1 && cmp1(v,qb[j],qb[j+1]);++j);
for(k=i;k<=j;++k) nv[f(qb[k])]=lab;
}
if(lab<nbc) dc3(nv,nsa,nbc,lab); else for(int i=0;i<nbc;++i) nsa[nv[i]]=i;
for(i=j=0;i<nbc;++i) if(nsa[i]<na) qb[j++]=3*nsa[i];
radixsort(v,qb,qa,na,m);
for(int i=0;i<nbc;++i) sav[qb[i]=rf(nsa[i])]=i;
for(i=lab=0,j=(n%3==1);i<na && j<nbc;){
sa[lab++]=cmp2(qb[j]%3,v,qa[i],qb[j])?qa[i++]:qb[j++];
}
while(i<na) sa[lab++]=qa[i++];
while(j<nbc) sa[lab++]=qb[j++];
}
int rnk[maxn],height[maxn],n;
inline void initHeight(int len){
for(int i=0;i<len;++i) rnk[sa[i]]=i;
for(int i=0;i<len;++i){
if(rnk[i]){
int j=0; if(i) j=max(0,height[rnk[i-1]]-1);
while(i+j<len && sa[rnk[i]-1]+j<len && v[i+j]==v[sa[rnk[i]-1]+j])++j;
height[rnk[i]]=j;
}
}
}
///the above is trivial DC3 implementation
inline void init(char*s,int ln){
n=ln;
for(int i=0;i<n;++i) v[i]=s[i];
dc3(v,sa,n,256); initHeight(n);
}
inline void init(){//read from stdin
n=Rx;int ma=0;
for(int i=0;i<n;++i) tensen(ma,v[i]=Rx);
dc3(v,sa,n,ma+5); initHeight(n);
}
///the above is trivial initial functions for Objective-SuffixArray implementation.
#undef maxn
} SAX;
#define Pair(v,t,x,y) struct v{\
t x,y;\
inline v(){}\
inline v(t x,t y):x(x),y(y){}\
}
Pair(ssp,int,l,r); // struct to store substring position
Pair(ans,int,x,y); // struct to store answer for function F
Pair(sap,int,l,r); // struct to store position in array SA
typedef ans spr;
inline ans operator+(const ans&a,const ans& b){
ans p(a.x,a.y);
if(b.x>a.x)p=b;
else if(a.x==b.x) p.y+=b.y;
return p;
}
struct SRMQ{
//RMQ with size
//which would be solved with doubling-based method
#define maxn 100010
#define lmaxn 18
spr sttbl[lmaxn][maxn];
inline void init(int n,int*v){
spr*p=sttbl[0],*q;
for(int i=0;i<n;++i) p[i]=ans(v[i],1);
for(int i=1,h=1,j=2;j<n;++i,h<<=1,j<<=1){
q=sttbl[i-1];
p=sttbl[i];
for(int k=0,_=n-j;k<=_;++k){
p[k]=q[k]+q[k+h];
}
}
}
inline spr operator()(int l,int r){
if(l>r)return spr(0,0);
int k=l;
spr answer(0,0);
for(int i=18;~i;--i){
int B=k+(1<<i);
if(B-1<=r){
answer=answer+sttbl[i][k];
k=B;
}
}
return answer;
}
#undef maxn
#undef lmaxn
};
struct tsolver{//tsolver helps to solve Operations 3 and 4
SAX str;
rmq_st stbl;
SRMQ stbl2;
#define maxn 100010
#define _sa str.sa
#define _rk str.rnk
#define _ht str.height
#define _sz str.n
#define ssp_invalid(sspx) (sspx.l<0 || sspx.l>=_sz || sspx.r<0 || sspx.r>=_sz)
#define ssp_reduced_invalid(sspx) (sspx.l<0 || sspx.r<0)
#define ssp_lengthd(sspx) (sspx.r-sspx.l+1)
////LCP
inline int LCP(int x,int y){ // should input a sap
if(x==y) return _sz-_sa[x];
if(x<y)x^=(y^=(x^=y));
if(x>=_sz) return 0;
if(y>=_sz) return 0;
return stbl(x+1,y);
}
//initialization!
inline void init(){
static int vr[maxn];
str.init();
stbl.init(_sz,_ht);
for(int i=0;i<_sz;++i) vr[i]=LCP(_rk[1],_rk[i]);
stbl2.init(_sz,vr);
}
////query left bound
inline int find_l(int a,int len){
int k=a;
for(int i=18;i>=0;++i){
int A=k-(1<<i);
if(A>=0 && LCP(A,a)>=len) k=A;
}
return k;
}
////query right bound. Similar.
inline int find_r(int a,int len){
int k=a;
for(int i=18;i>=0;++i){
int A=k+(1<<i);
if(A<_sz && LCP(a,A)>=len) k=A;
}
return k;
}
////combine the two
inline sap find_str_bounds(ssp x){
int len=x.r-x.l+1;
return sap(find_l(_rk[x.l],len),find_r(_rk[x.l],len));
}
////cmp two strings pos@($a&$b) wiz len $len
inline int compare_string(int a,int b,int len){
if(a==b)return 0;
int A=LCP(_rk[a],_rk[b]);
if(A>=len) return 0;//equal
if(_rk[a]<_rk[b]) return -1;
if(_rk[a]>_rk[b]) return 1;
}
inline int FindConcat(ssp a,ssp b){
if(ssp_reduced_invalid(a)||ssp_reduced_invalid(b))return -1; //range checking should always come first
sap Dx=find_str_bounds(a); //find occurences of substring a
int i,k=Dx.l,La=ssp_lengthd(a),Lb=ssp_lengthd(b);
if(compare_string(_sa[Dx.l]+La,b.l,Lb)>0) return 0; //simple boundary test
if(compare_string(_sa[Dx.r]+La,b.l,Lb)<0) return 0;
//find answer by doubling
for(int i=18;~i;--i){
int B=k+(1<<i);
if(B<=Dx.r && compare_string(_sa[B]+La,b.l,Lb)<0) k=B;
}
if(compare_string(_sa[k]+La,b.l,Lb)<0)++k; //last modifies
int lcx=LCP(_rk[_sa[k]+La],_rk[b.l]); //check fitness
if(lcx>=Lb) return _sa[k]; //if fit
return -1; //or if not
}
////things below are for border tree
#undef _sa
#undef _rk
#undef _ht
#undef _sz
#undef maxn
};
struct bt_edge{
int t;
bt_edge*n;
};
struct bt_node{
int x,y,z,DF;
int fa,sh,ma;
bt_edge*h,*b;
};
struct border_tree{
#define maxn 100010
int p[maxn],f[maxn],n;
bt_node tr[maxn],*tre;
bt_edge eds[maxn*2],*ek;
inline void addedge(int f,int t){
*ek=(bt_edge){t,tre[f].h};
tre[f].h=ek++;
}
inline void addBedge(int f,int t){
*ek=(bt_edge){t,tre[f].b};
tre[f].b=ek++;
}
inline void KMP_fail(int*px,int len){
ek=eds; tre=tr+1;//add tolerance for node#-1
n=len;
for(int i=0;i<n;++i) p[i]=px[i];
f[0]=-1;
for(int i=1,j=-1;i<n;++i){
for(;(~j) && p[j+1]!=p[i];j=f[j]);
if(p[j+1]==p[i])++j;
f[i]=j;
}
for(int i=0;i<n;++i) addedge(f[i],i);///making a KMP automaton
}
#define ue bt_edge
#define un bt_node
inline void dfs1(int u){
un*p=tre+u;
for(ue*i=tre[u].h;i;i=i->n){
int A=i->t;
un*kn=tre+A;
kn->DF=u;
if(u&&u*2>=A){
//A is a cycling border
kn->y=A-u;
kn->x=u%kn->y;
if(p->x==kn->x && p->y==kn->y) kn->z=p->z+1; else kn->z=2;
}else{
kn->x=u;
kn->y=A-u;
kn->z=1;
}
dfs1(A);
}
}
inline void dfs2(int u){
un*p=tre+u;
for(ue*i=tre[u].h;i;i=i->n){
un*kn=tre+i->t;
if(kn->z==2 && p->z==1){
p->x=kn->x;
p->y=kn->y;
}
dfs2(i->t);
}
}
inline void dfs3(int u){
un*p=tre+u;
for(ue*i=tre[u].h;i;i=i->n){
un*kn=tre+i->t;
if(p->z && kn->z==p->z+1) kn->fa=p->fa;
else{
addBedge(p->fa,i->t);
kn->fa=i->t;
kn->sh=p->fa;
}
dfs3(i->t);
}
relax(tre[p->fa].ma,p->z);
}
inline void init(int*px,int len){
KMP_fail(px,len);
dfs1(-1);
dfs2(-1);
dfs3(-1);
}
};
int main(){ readin();
return 0;
}
其实半完成都算不上...
似乎差不多半完成了.
现在好想吐槽sone爷的代码...完全没有语义!完全没有注释!
sone2(未完成)的更多相关文章
- [占位-未完成]scikit-learn一般实例之十一:异构数据源的特征联合
[占位-未完成]scikit-learn一般实例之十一:异构数据源的特征联合 Datasets can often contain components of that require differe ...
- [占位-未完成]scikit-learn一般实例之十:核岭回归和SVR的比较
[占位-未完成]scikit-learn一般实例之十:核岭回归和SVR的比较
- [未完成]WebService学习第一天学习笔记
[未完成]WebService学习第一天学习笔记[未完成]WebService学习第一天学习笔记
- [未完成]关于GUI Java图形化界
"笔记内容完成,整体未完成" GUI 图形化用户界面 用java做图形化用户界面的程序不多,大多用C++和defy.因为,Java做图形化效率低. 首先你要安装一个虚拟机,C++是 ...
- BotVS开发基础—2.4 获取订单、取消订单、获取未完成订单
代码 RetryDelay = 1500; def CancelPendingOrders(exch, orderType): # 取消所有未完成的挂单, 参数1 交易所 参数2 类型 global ...
- 未完成的IT路停在回车键---2014年末总结篇
时间都去哪儿了? 一晃而过,越来越能体会到这个词的真实感.特别是过了二十岁,这种感觉越来越深刻,越来越强烈,犹如小编做公交车的时候一直向后排排倒的香樟树,还记得有首歌叫时间都哪儿了,而 ...
- 10. vue axios 请求未完成时路由跳转报错问题
axios 请求未完成时路由跳转报错问题 前两天项目基本功能算是完成了,在公司测试时遇到了遇到了一个问题,那就是在请求未完成时进行路由跳转时会报错,想了几种办法来解决,例如加loading,请求拦截, ...
- MySQL基础整理(一)之SQL基础(未完成)
大家好,我是浅墨竹染,以下是MySQL基础整理(一)之SQL基础 1.SQL简介 SQL(Structure Query Language)是一种结构化查询语言,是使用关系模型的数据库应用语言. 2. ...
- HangFire循环作业中作业因执行时间太长未完成新作业开启导致重复数据的问题
解决方法:在执行的任务方法前加上Mutex特性即可,如果作业未完成,新作业开启的话,新作业会放入计划中的作业队列中,直到前面的作业完成. 必须使用Hangfire.Pro.Redis 和 Hangfi ...
随机推荐
- OpenGL Driver Architecture[转]
http://www.cnblogs.com/cgwolver/archive/2009/01/04/1368350.html
- MySQL编译安装错误:No curses/termcap library found的解决方法
CentOS编译安装MySQL,./coonfigure时出现错误: checking for termcap functions library... configure: error: No cu ...
- maven 入门
Apache Maven 入门篇 ( 上 ) 作者:George Ma 写这个 maven 的入门篇是因为之前在一个开发者会的动手实验中发现挺多人对于 maven 不是那么了解,所以就有了这个想法.这 ...
- verilog阻塞与非阻塞的初步理解(一)
通过两个模块来区别两者.测试平台:Modelsim altera 6.5b 阻塞模块: module blocking(clk,a,b,c); :] a; input clk; :] b,c; :] ...
- Task异常处理
http://www.cnblogs.com/xray2005/archive/2011/08/24/2151459.html
- jQuery parent.append和$after的区别
首先假设我们有个id为test的div和一个id为test2的div: <div id="test"> 我是测试div </div> <div ...
- fedora各个版本的下载地址archive
archive: ['a:kaiv] she went to the city archive this morning. ==================== === fedora 的下载地址是 ...
- CF448C Painting Fence (分治递归)
Codeforces Round #256 (Div. 2) C C. Painting Fence time limit per test 1 second memory limit per tes ...
- NUGet的诞生与使用
本文引用地址:http://msdn.microsoft.com/zh-cn/magazine/hh547106.aspx NuGet 使用 NuGet 管理项目库 Phil Haack 无论多么努力 ...
- [译]Node.js Best Practices
原文: http://blog.risingstack.com/node-js-best-practices/ 下面的的最佳实践分为代码风格和开发工作流两种. 代码风格 Callback约定 Modu ...