zoukankan      html  css  js  c++  java
  • ●BZOJ 1692 [Usaco2007 Dec]队列变换

    题链:

    http://www.lydsy.com/JudgeOnline/problem.php?id=1692

    题解:

    后缀数组,贪心
    由于每次可以取出旧队列的首部或尾部放在新队列的尾部。
    所以就需要比较旧队列的首部开始的后缀和尾部开始的前缀(反过来)的字典序大小。
    于是考虑把原串反向,兵和原串拼接在一起,用分隔符隔开,并求出后缀排名,用于之后的比较。

    代码:

    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #define MAXN 60500
    #define filein(x) freopen(#x".in","r",stdin);
    #define fileout(x) freopen(#x".out","w",stdout);
    using namespace std;
    char S[MAXN];
    int sa[MAXN],rak[MAXN],hei[MAXN],bel[MAXN];
    void build(int N,int M){
    	static int cc[MAXN],ta[MAXN],tb[MAXN],*x,*y,h,p;
    	x=ta; y=tb; h=0;
    	for(int i=0;i<M;i++) cc[i]=0;
    	for(int i=0;i<N;i++) cc[x[i]=S[i]]++;
    	for(int i=1;i<M;i++) cc[i]+=cc[i-1];
    	for(int i=N-1;i>=0;i--) sa[--cc[x[i]]]=i;
    	for(int k=1;p=0,k<N;k<<=1){
    		for(int i=N-k;i<N;i++) y[p++]=i;
    		for(int i=0;i<N;i++) if(sa[i]>=k) y[p++]=sa[i]-k;
    		for(int i=0;i<M;i++) cc[i]=0;
    		for(int i=0;i<N;i++) cc[x[y[i]]]++;
    		for(int i=1;i<M;i++) cc[i]+=cc[i-1];
    		for(int i=N-1;i>=0;i--) sa[--cc[x[y[i]]]]=y[i];
    		swap(x,y); y[N]=-1; x[sa[0]]=0; M=1;
    		for(int i=1;i<N;i++)
    			x[sa[i]]=y[sa[i]]==y[sa[i-1]]&&y[sa[i]+k]==y[sa[i-1]+k]?M-1:M++;
    		if(M>=N) break;
    	}
    	for(int i=0;i<N;i++) rak[sa[i]]=i;
    	for(int i=0,j;i<N;i++){
    		if(h) h--;
    		if(rak[i]){
    			j=sa[rak[i]-1];
    			while(S[i+h]==S[j+h]) h++;
    		}
    		hei[rak[i]]=h;
    	}
    }
    int main()
    {
    	int N,l,r,n,cnt=0;
    	scanf("%d",&N);n=N; l=0; r=N-1;
    	for(int i=0;i<N;i++) scanf(" %c",&S[i]); S[N]='&';
    	for(int i=N-1;i>=0;i--) S[N+N-i]=S[i]; N+=N+1;
    	build(N,300);
    	
    	while(l<=r){
    		if(rak[l]<rak[n+n-r]) printf("%c",S[l++]);
    		else printf("%c",S[r--]);
    		if(++cnt==80) printf("
    "),cnt=0;
    	}
    
    	return 0;
    }
    

  • 相关阅读:
    Qt QApplication 类简介--Qt 类简介专题(四)
    回调函数
    C++类型转换总结
    Debug Error
    C++回调函数(callback)的使用
    Nokia5230连接电脑无线上网
    photoshop cs6\cs5找不到扫描仪的解决办法(Twain_32.8BA补丁下载)
    UML类图几种关系的总结
    实现单点登录
    poj 1151Atlantis线段树求矩形面积并解题报告
  • 原文地址:https://www.cnblogs.com/zj75211/p/8000729.html
Copyright © 2011-2022 走看看