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 |
求巨巨告知wa在何处呀#include <cstdio> #include <algorithm> #include <cstring> #include <iostream> #include <string> using namespace std; #define maxn 200002 #define rep(i,n) for(int i = 0;i < n; i++) using namespace std; const int size = 200005,INF = 1<<30; int rk[size],sa[size],height[size],w[size],wa[size],res[size]; void getSa (int len,int up) { int *k = rk,*id = height,*r = res, *cnt = wa; rep(i,up) cnt[i] = 0; rep(i,len) cnt[k[i] = w[i]]++; rep(i,up) cnt[i+1] += cnt[i]; for(int i = len - 1; i >= 0; i--) { sa[--cnt[k[i]]] = i; } int d = 1,p = 0; while(p < len){ for(int i = len - d; i < len; i++) id[p++] = i; rep(i,len) if(sa[i] >= d) id[p++] = sa[i] - d; rep(i,len) r[i] = k[id[i]]; rep(i,up) cnt[i] = 0; rep(i,len) cnt[r[i]]++; rep(i,up) cnt[i+1] += cnt[i]; for(int i = len - 1; i >= 0; i--) { sa[--cnt[r[i]]] = id[i]; } swap(k,r); p = 0; k[sa[0]] = p++; rep(i,len-1) { if(sa[i]+d < len && sa[i+1]+d <len &&r[sa[i]] == r[sa[i+1]]&& r[sa[i]+d] == r[sa[i+1]+d]) k[sa[i+1]] = p - 1; else k[sa[i+1]] = p++; } if(p >= len) return ; d *= 2,up = p, p = 0; } } void getHeight(int len) { rep(i,len) rk[sa[i]] = i; height[0] = 0; for(int i = 0,p = 0; i < len - 1; i++) { int j = sa[rk[i]-1]; while(i+p < len&& j+p < len&& w[i+p] == w[j+p]) { p++; } height[rk[i]] = p; p = max(0,p - 1); } } int getSuffix(string s) { int len = s.size(),up = 0; for(int i = 0; i < len; i++) { w[i] = s[i]; up = max(up,w[i]); } w[len++] = 0; getSa(len,up+1); getHeight(len); return len; } int main() { int n; int up=0; int a[maxn]; scanf ("%d",&n); for(int i=0;i<n;i++){ scanf ("%d",&a[i]); up=max(up,a[i]); } reverse_copy(a,a+n,w); getSa(n,up+1); int p1; for(int i=0;i<n;i++){ p1=n-sa[i]; if(p1>=1&&n-p1>=2) break; } int m=sa[0]; reverse_copy(a+p1,a+n,w); reverse_copy(a+p1,a+n,w+m); getSa(2*m,up+1); int p2; for(int i=0;i<=2*m;i++) { p2=p1+m-sa[i]; if(p2-p1>=1&&n-p2>=1) break; } reverse(a,a+p1); reverse(a+p1,a+p2); reverse(a+p2,a+n); for(int i=0;i<n;i++) printf("%d\n",a[i]); return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator