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 ...
 
随机推荐
- Robot Framework--05 案例设计之流程与数据分离
			
转自:http://blog.csdn.net/tulituqi/article/details/7651049 这一讲主要说一下案例设计了.还记得我们前面做的case么?先打开浏览器访问百度,输入关 ...
 - xmanager远程桌面连接Linux
			
远程桌面连接Linux,两种工具:vnc.xmanager xmanager使用参考如下,暂未整理: Xmanager连接Centos的远程桌面 | 大爱 http://lovesoo.org/xma ...
 - webform中使用webapi,并且使用autofac
			
private void AutofacIoCRegister() { HttpConfiguration config = GlobalConfiguration.Configuration; if ...
 - jQuery监听键盘事件及相关操作使用教程
			
一.首先需要知道的是: 1.keydown() keydown事件会在键盘按下时触发. 2.keyup() keyup事件会在按键释放时触发,也就是你按下键盘起来后的事件 3.keypress() k ...
 - MIT Scheme 使用 Edwin
			
MIT Scheme 的基本使用:http://www.math.pku.edu.cn/teachers/qiuzy/progtech/scheme/mit_scheme.htm 安装过程 安装bre ...
 - OC-苹果官方文档
			
苹果官方文档 help>documentation>左边iOS>language>objective>the objective-c programming langua ...
 - Hibernate 查询MatchMode的四种模式
			
Hibernate 查询MatchMode的四种模式 MatchMode.START:字符串在最前面的位置.相当于"like 'key%'" MatchMode.END:字符串在最 ...
 - TP框架整合Swagger UI接口文档
			
1.下载swagger ui:http://swagger.io/swagger-ui/: 2.在应用目录里新建一个目录xxx:如图 3.解压后把dist目录的所有文件拷贝到新建的目录里面: 4.在新 ...
 - 淘宝首页源码藏美女彩蛋(上)(UED新作2013egg)
			
今日,偶尔翻看淘宝源码,发现竟有美女形状源码.如下图: 此段代码在console中运行,结果更为惊叹. 亲手尝试的读者已经看到了代码运行的结果.taobao.com的console打印出了UED的招聘 ...
 - 1、Java背景、标示符、运算符、转义字符
			
一.Java平台: 1.Java的创建:1991年由SUN公司创建. 2.Java的特点:面向对象.可移植性.多线程.分布式.可靠.安全. 3.Java的三个架构:JavaEE.JavaSElect. ...