SPOJ 220 Relevant Phrases of Annihilation (后缀数组)

2015-07-24 05:44:03 · 作者: · 浏览: 5

题目大意:

求在m个串中同时出现两次以上且不覆盖的子串的长度。


思路分析:

二分答案,然后check是否满足,判断不覆盖的方法就是用up down 来处理边界。


#include 
  
   
#include 
   
     #include 
    
      #include 
     
       #include 
       #include 
       
         #define maxn 110005 using namespace std; char str[maxn]; int sa[maxn],t1[maxn],t2[maxn],c[maxn],n; void suffix(int m) { int *x=t1,*y=t2; for(int i=0; i
        
         =0; i--)sa[--c[x[i]]]=i; for(int k=1; k<=n; k<<=1) { int p=0; for(int i=n-k; i
         
          =k)y[p++]=sa[i]-k; for(int i=0; i
          
           =0; i--)sa[--c[x[y[i]]]]=y[i]; swap(x,y); p=1; x[sa[0]]=0; for(int i=1; i
           
            =n)break; m=p; } } int rank[maxn],height[maxn]; void getheight() { int k=0; for(int i=0; i
            
             >1; if(check(mid,m)) ans=mid,l=mid+1; else r=mid-1; } printf("%d\n",ans); } return 0; }