Exemple #1
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;
}
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);
}
Exemple #3
0
/*
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;
}