stl::sort实现的后缀数组,超级慢。

变量名打错好几个导致WA好几次。

http://www.lydsy.com/JudgeOnline/problem.php?id=4278

/**************************************************************

    Problem: 4278

    User: 1349367067

    Language: C++

    Result: Accepted

    Time:7900 ms

    Memory:13776 kb

****************************************************************/

 

#include<iostream>

#include<cstdio>

#include<cstring>

#include<algorithm>

usingnamespacestd;

intn,m,a[200011]={},b[200011]={};

intr[800011]={},num;

intSA[400011]={},RA[400011]={};

voidinit()

{

     scanf("%d",&n);

     for(inti=1;i<=n;i++) scanf("%d",&a[i]);

     scanf("%d",&m);

     for(inti=1;i<=m;i++) scanf("%d",&b[i]);

      

     for(inti=1;i<=n;i++) r[i]=a[i];

     for(inti=1;i<=m;i++) r[n+i+1]=b[i];

     r[n+1+m+1]=r[n+1]=1000000;

     num=n+m+2;

}

structTEM

{

       intx,y,i;

}tem[400011];

boolcmp(TEM a,TEM b)

{

     if(a.x<b.x) return1;

     if(a.x>b.x) return0;

     if(a.y<b.y) return1;

     return0;

}

voidprintff()

{

     for(inti=1;i<=num;i++)

         cout<<tem[i].x<<" "<<tem[i].y<<" "<<tem[i].i<<endl;

     cout<<"*************"<<endl;

     system("pause");

}

voidprintfff()

{

     for(inti=1;i<=num;i++)

         cout<<r[i]<<" ";

     cout<<endl<<"&&&&&&&&&&&&&"<<endl;

     system("pause");

}

boolcheck(inti)

{

     if(tem[i].x==tem[i-1].x&&tem[i].y==tem[i-1].y)

        returntrue;

     returnfalse;

}

voidsuffix_maker()

{

     intt,T;

     for(inti=1;i<=num;i++)

     {

         tem[i].x=r[i];tem[i].y=0;

         tem[i].i=i;

     }

     sort(tem+1,tem+num+1,cmp);

     //printff();

     T=0;

     for(inti=1;i<=num;i++)

     {

         if(!check(i)) T++;

         t=tem[i].i;

         r[t]=T;

     }

     //printfff();

     for(inti=1;i<=num;i=i*2)

     {

         for(intj=1;j<=num;j++)

         {

             tem[j].x=r[j];tem[j].y=r[j+i];

             tem[j].i=j;

         }

         sort(tem+1,tem+num+1,cmp);

         //printff();

         T=0;

         for(intj=1;j<=num;j++)

         {

             if(!check(j)) T++;

             t=tem[j].i;

             r[t]=T;

         }

         //printfff();

     }

      

      

      

}

voidwork()

{

     intl=1,R=1;

      

     while(!(l>n&&R>m))

     {

           //cout<<endl<<l-1<<" * "<<R-1<<endl;

           if(l>n) {printf("%d ",b[R++]);continue;}

           if(R>m) {printf("%d ",a[l++]);continue;}

           if(a[l]<b[R]) {printf("%d ",a[l++]);continue;}

           if(a[l]>b[R]) {printf("%d ",b[R++]);continue;}

           if(r[l]<r[n+R+1])

              {printf("%d ",a[l++]);continue;}

           else

              {printf("%d ",b[R++]);continue;}

     }

}

intmain()

{

    init();

    suffix_maker();

    //printfff();

    work();

  

    return0;

}
View Code