Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
Re:贴个ac代码In Reply To:贴个ac代码 Posted by:lmc596922196 at 2015-03-08 13:04:27 > #include<iostream> > #include<math.h> > #include<stdio.h> > #include<algorithm> > #include<string.h> > #include<vector> > #include<queue> > #include<map> > #include<set> > using namespace std; > #define B(x) (1<<(x)) > typedef long long ll; > const int oo=0x3f3f3f3f; > const ll OO=1LL<<61; > const int MOD=10007; > const int maxn=400005; > int rank[maxn],SA[maxn],height[maxn]; > int t1[maxn],t2[maxn],t3[maxn],t4[maxn]; > int ss[maxn]; > > void Swap(int*& x,int*& y){ > > int *temp=x; > x=y; > y=temp; > } > > bool cmp(int t[],int a,int b,int l){ > > return t[a]==t[b]&&t[a+l]==t[b+l]; > } > > bool cp(int a,int b){ > > return ss[a]<ss[b]; > } > > void build_SA(int s[],int len,int up){ > > int *k1=t1,*k2=t2,*r=t3,*cnt=t4; > for(int i=0;i<len;i++)k2[i]=i; > sort(k2,k2+len,cp); > for(int i=0;i<len;i++)SA[i]=k2[i]; > k1[SA[0]]=0; > int p=1; > for(int i=1;i<len;i++){ > k1[SA[i]]= s[SA[i]]==s[SA[i-1]] ? p-1 : p++; > } > up=p; > p=1; > for(int d=1;p<len;d<<=1,up=p){ > > p=0; > for(int i=len-d;i<len;i++)k2[p++]=i; > for(int i=0;i<len;i++)if(SA[i]>=d)k2[p++]=SA[i]-d; > for(int i=0;i<len;i++)r[i]=k1[k2[i]]; > > for(int i=0;i<up;i++)cnt[i]=0; > for(int i=0;i<len;i++)cnt[r[i]]++; > for(int i=1;i<up;i++)cnt[i]+=cnt[i-1]; > for(int i=len-1;i>=0;i--)SA[--cnt[r[i]]]=k2[i]; > > Swap(k1,k2); > k1[SA[0]]=0; > p=1; > for(int i=1;i<len;i++){ > k1[SA[i]]= cmp(k2,SA[i-1],SA[i],d) ? p-1 : p++; > } > } > } > > void get_height(int s[],int len){ > > for(int i=1;i<=len;i++)rank[SA[i]]=i; > for(int i=0,p=0;i<len;i++){ > > int j=SA[rank[i]-1]; > while(s[i+p]==s[j+p])p++; > height[rank[i]]=p; > if(p)p--; > } > } > > void output(int out[],int s,int e){ > > for(int i=s;i<=e;i++){ > printf("%d\n",out[i]); > } > } > > int main(){ > > int n,e,start; > scanf("%d",&n); > for(int i=n-1;i>=0;i--)scanf("%d",&ss[i]); > ss[n]=-oo; > build_SA(ss,n+1,-1); > get_height(ss,n); > for(int i=1;i<=n;i++){ > if(SA[i]>=2){ > start=SA[i]; > break; > } > } > output(ss,start,n-1); > e=start; > n=e; > for(int i=0;i<e;i++)ss[n++]=ss[i]; > ss[n]=-oo; > build_SA(ss,n+1,-1); > get_height(ss,n); > for(int i=1;i<=n;i++){ > if(SA[i]<e&&SA[i]>=1){ > start=SA[i]; > break; > } > } > output(ss,start,e-1); > output(ss,0,start-1); > return 0; > } > /** > 4 > 10000 > 2 > 1000 > 6 > > 3 > 3 2 1 > */ Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator