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; }
int main() { //预处理每个数字的Log值,常数优化,用于RMQ Log[0] = -1; for (int i = 1; i <= M ; i ++) { Log[i] = (i & (i - 1)) ? Log[i - 1] : Log[i - 1] + 1 ; } //******************************************* // n为数组长度,下标0开始 // 将初始数据,保存在init里,并且保证每个数字都比0大 // m = max{ init[i] } + 1 // 一般情况下大多是字符操作,所以128足够了 //******************************************* init[n] = 0; suffix(n + 1, m); initRMQ(n); }
/* printa(int a[],int n) { for(int i=0;i<=n;i++) printf("%d ",a[i]); printf("\n"); } */ int main() { while(scanf("%s",str)==1) { int len=strlen(str); int n=2*len+1; for(int i=0;i<len;i++) r[i]=str[i]; for(int i=0;i<len;i++) r[len+i+1]=str[len-1-i]; r[n]=0; r[len]=1; da(r,sa,rank,height,n,128); for(int i=1;i<=n;i++) RMQ[i]=height[i]; initRMQ(n); int ans=0,st,tmp; for(int i=0;i<len;i++) { tmp=lcp(i,n-i); if(2*tmp>ans) { ans=2*tmp; st=i-tmp; } tmp=lcp(i,n-i-1); if(2*tmp-1>ans) { ans=2*tmp-1; st=i-tmp+1; } //printf("%d %d %d\n",ans,tmp,st); } str[st+ans]=0; printf("%s\n",str+st); /* printa(sa,len); printa(rank,len); printa(height,len); for(int i=0;i<len-1;i++) { for(int j=i+1;j<len;j++) { printf("%d-%d:lcp=%d\n",i,j,lcp(i,j)); } } */ } return 0; }