int main() { int i , j , n , m = 0 ; char ch; scanf("%d", &n ); getchar(); for( i = 0 ; i <= n ; ++ i ) { scanf("%c", &ch ); r[ i ] = ch - 48; m = m > r[ i ] ? m : r[ i ] + 1 ; } for( i = 0 ; i < n ; ++ i ) printf("%d ",r[ i ]);printf("\n"); //r[ n ++ ] = 0 ; dc3( r , sa , n , m ); for( i = 0 ; i < n ; ++ i ) printf("%d ",sa[ i ]); printf("\n"); /* calheight( r , sa , n ); for( i = 0 ; i < n ; ++ i ) printf("%d ",rank[ i ]);printf("\n"); initRMQ( n ); printf("!!!!\n"); while( 1 ) { int a,b; scanf("%d%d",&a,&b); printf("%d %d\n", askRMQ( a , b ) , lcp( a , b )); } */ return 0; }
int main() { int i,n,len,k,ans=0,w; scanf("%s",st); len=strlen(st); for(i=0;i<len;i++) r[i]=st[i]; r[len]=1; for(i=0;i<len;i++) r[i+len+1]=st[len-1-i]; n=len+len+1; r[n]=0; dc3(r,sa,n+1,128); calheight(r,sa,n); for(i=1;i<=n;i++) RMQ[i]=height[i]; initRMQ(n); for(i=0;i<len;i++) { k=lcp(i,n-i); if(k*2>ans) ans=k*2,w=i-k; k=lcp(i,n-i-1); if(k*2-1>ans) ans=k*2-1,w=i-k+1; } st[w+ans]=0; printf("%s\n",st+w); return 0; }
void dc3(int *r, int *sa, int n, int m) { int j, *rn = r + n, *san = sa + n, ta = 0, tb = (n + 1) / 3, tbc = 0, p; r[n] = r[n + 1] = 0; rep(i, n) if (i % 3 != 0) wa[tbc++] = i; rsort(r + 2, wa, wb, tbc, m); rsort(r + 1, wb, wa, tbc, m); rsort(r, wa, wb, tbc, m); for (p = 1, rn[F(wb[0])] = 0, j = 1; j < tbc; j++) rn[F(wb[j])] = c0(r, wb[j - 1], wb[j]) ? p - 1 : p++; if (p < tbc) dc3(rn, san, tbc, p); else rep(i, tbc) san[rn[i]] = i; rep(i, tbc) if (san[i] < tb) wb[ta++] = san[i] * 3; if (n % 3 == 1) wb[ta++] = n - 1; rsort(r, wb, wa, ta, m); rep(i, tbc) wv[wb[i] = G(san[i])] = i; int i; for (i = j = p = 0; i < ta && j < tbc; p++) sa[p] = c12(wb[j] % 3, r, wa[i], wb[j]) ? wa[i++] : wb[j++]; for (; i < ta; p++) sa[p] = wa[i++]; for (; j < tbc; p++) sa[p] = wb[j++]; }
inline void dc3(int *str,int *sa,const int &n,const int &m) { int *strn(str+n); int *san(sa+n),tb((n+1)/3),ta(0),tbc(0),i,j,k; str[n]=str[n+1]=0; for(i=0; i<n; ++i) if(i%3) wa[tbc++]=i; sort(str+2,wa,wb,tbc,m); sort(str+1,wb,wa,tbc,m); sort(str,wa,wb,tbc,m); for(i=j=1,strn[F(wb[0])]=0; i<tbc; ++i) strn[F(wb[i])]=c0(str,wb[i-1],wb[i])?j-1:j++; if(j<tbc) dc3(strn,san,tbc,j); else for(i=0; i<tbc; ++i) san[strn[i]]=i; for(i=0; i<tbc; ++i) if(san[i]<tb) wb[ta++]=san[i]*3; if(n%3==1) wb[ta++]=n-1; sort(str,wb,wa,ta,m); for(i=0; i<tbc; ++i) wv[wb[i]=G(san[i])]=i; for(i=j=k=0; i<ta && j<tbc;) sa[k++]=c12(str,wb[j]%3,wa[i],wb[j])?wa[i++]:wb[j++]; while(i<ta) sa[k++]=wa[i++]; while(j<tbc) sa[k++]=wb[j++]; }
void da(int str[], int sa[], int rnk[], int height[], int n, int m) { for (int i = n; i < n * 3; i++) { str[i] = 0; } dc3(str, sa, n + 1, m); int i, j, k = 0; for (i = 0; i <= n; i++) { rnk[sa[i]] = i; } for (i = 0; i < n; i++) { if (k) { k--; } j = sa[rnk[i] - 1]; while (str[i + k] == str[j + k]) { k++; } height[rnk[i]] = k; } }
int main() { int i,n,t,ans; scanf("%d",&t); while(t-->0) { scanf("%s",s); n=strlen(s); for(i=0;i<n;i++) r[i]=s[i]; r[n]=0; dc3(r,sa,n+1,128); calheight(r,sa,n); ans=n*(n+1)/2; for(i=1;i<=n;i++) ans-=height[i]; printf("%d\n",ans); } return 0; }
int main() { scanf("%d %d",&n,&j); for(i=0; i<n; ++i) { scanf("%d",&k); num[i]=k-j+100; j=k; } num[n]=0; dc3(num,sa,n+1,191); //`191: str中取值范围,桶排序` for(i=1; i<=n; ++i) // `rank数组` rk[sa[i]]=i; for(i=k=0; i<n; ++i) // `lcp数组` if(!rk[i]) lcpa[0]=0; else { j=sa[rk[i]-1]; if(k>0) --k; while(num[i+k]==num[j+k]) ++k; lcpa[rk[i]]=k; } for(i=1; i<=n; ++i) sptb[0][i]=i; for(i=1; i<=lg[n]; ++i) //sparse table RMQ { k=n+1-(1<<i); for(j=1; j<=k; ++j) { a=sptb[i-1][j]; b=sptb[i-1][j+(1<<(i-1))]; sptb[i][j]=lcpa[a]<lcpa[b]?a:b; } } }
int main() { int i,j,n,ans=0,w; scanf("%d",&j); scanf("%s",s); s[j]=1; scanf("%s",s+j+1); n=j+j+1; for(i=0;i<n;i++) r[i]=s[i]; r[n]=0; dc3(r,sa,n+1,128); calheight(r,sa,n); for(i=2;i<=n;i++) if(height[i]>ans) if((j<sa[i-1] && j>sa[i]) || (j>sa[i-1] && j<sa[i])) ans=height[i],w=sa[i]; s[w+ans]=0; printf("%s\n",s+w); return 0; }
void dc3(int *r, int *sa, int n, int m) { int i, j, *rn = r + n; int *san = sa + n, ta = 0, tb = (n + 1) / 3, tbc = 0, p; r[n] = r[n + 1] = 0; for (i = 0; i < n; i++) { if (i % 3 != 0) { wa[tbc++] = i; } } Sort(r + 2, wa, wb, tbc, m); Sort(r + 1, wb, wa, tbc, m); Sort(r, wa, wb, tbc, m); for (p = 1, rn[F(wb[0])] = 0, i = 1; i < tbc; i++) { rn[F(wb[i])] = c0(r, wb[i - 1], wb[i]) ? p - 1 : p++; } if (p < tbc) { dc3(rn, san, tbc, p); } else { for (i = 0; i < tbc; i++) { san[rn[i]] = i; } } for (i = 0; i < tbc; i++) { if (san[i] < tb) { wb[ta++] = san[i] * 3; } } if (n % 3 == 1) { wb[ta++] = n - 1; } Sort(r, wb, wa, ta, m); for (i = 0; i < tbc; i++) { wv[wb[i] = G(san[i])] = i; } for (i = 0, j = 0, p = 0; i < ta && j < tbc; p++) { sa[p] = c12(wb[j] % 3, r, wa[i], wb[j]) ? wa[i++] : wb[j++]; } for (; i < ta; p++) { sa[p] = wa[i++]; } for (; j < tbc; p++) { sa[p] = wb[j++]; } }
int main() { while (scanf("%s", str), strcmp(str, ".") != 0) { int len = strlen(str); for (int i = 0; i < len; i++) { r[i] = str[i]; } r[len] = 0; dc3(r, sa, len + 1, 300); calheight(r, sa, len); /* for(int i=0;i<=len;i++){ printf("%d ", sa[i]); } puts(""); for(int i=0;i<len;i++){ printf("%d ", rank[i]); } puts(""); for(int i=1;i<=len;i++){ printf("%d ", height[i]); } puts(""); //*/ int ans; memset(map, 0, sizeof(map)); make_rmq(len); for (int i = 1; i <= len; i++) { if (len % i)continue; if (check(i, len)) { ans = len / i; break; } } printf("%d\n", ans); } return 0; }
bool BF3PointCircle::getCircle(BFCoordinate<int> c1, BFCoordinate<int> c2, BFCoordinate<int> c3, BFCircle& circle) { BFCoordinate<double> center; bool bCenter = BF3PointCircle::getCenter(c1,c2,c3,center); if(bCenter == false) return false; circle.setX0(center.getX()); circle.setY0(center.getY()); BFCoordinate<double> dc1(static_cast<double>(c1.getX()), static_cast<double>(c1.getY())); BFCoordinate<double> dc2(static_cast<double>(c2.getX()), static_cast<double>(c2.getY())); BFCoordinate<double> dc3(static_cast<double>(c3.getX()), static_cast<double>(c3.getY())); double r1 = BFCoordinate<double>::distance(center, dc1); double r2 = BFCoordinate<double>::distance(center, dc2); double r3 = BFCoordinate<double>::distance(center ,dc3); double r = (r1+r2+r3)/3.0; circle.setR(r); return true; }
int main(){ int n,m=0; scanf("%d",&n); for (int i=0;i<n;i++) scanf("%d",&s[i]),s[i]++,m=max(s[i]+1,m); printf("%d\n",m); s[n++]=0; dc3(s,sa,n,m); for (int i=0;i<n;i++) printf("%d ",sa[i]);printf("\n"); }