后缀数组倍增法模板

后缀数组倍增法模板

#include 
using namespace std; 
int n,k,ranks[100003],sa[12]; //SA数组的含义:SA[I]表示所有后缀中排第I位的起始位是SA[i]
bool compare_sa(int i,int j){ //比较起始位置为i与j的后缀先后
    if(ranks[i]!=ranks[j])return ranks[i]1){ 		//二分后缀起始位,
        int c=(a+b)/2;	//下面compare是STL中STRING封装函数,文末说明
        if(s.compare(sa[c],t.length(),t)<0)a=c; //<0则S比T小,故答案排名靠后,左界右移
        else b=c;		//否则右界左移,这里包含了相等的情况,在最后再判是否等于0
    }
    return s.compare(sa[b],t.length(),t)==0;
}
int main(){
    string s="abracadabra";construct_sa(s,sa);
    for(int i=0;i<12;i++)cout<
#include 
using namespace std;
int main(){
    string a("aBcdef");string b("AbcdEf");string c("123456");string d("123dfg");
    //下面是各种比较方法,前面减去后面的ASCII码,>0返回1,<0返回-1,相同返回0
    int m=a.compare(b); //完整比较a和b
    int n=a.compare(1,5,b); //“Bcdef”和“AbcdEf”的比较,比较a和b的从1到5位
    int p=a.compare(1,5,b,4,2); //“Bcdef”和“Ef”的比较
    int q=c.compare(0,3,d,0,3); //"123"和“123”的比较
    cout<<"m="<= h[i-1]-1 = 1;
虽然从第k位开始的后缀排名不一定是从i-1位开始的后缀的排名的前一位,但是因为两者有LCP=h[i-1]-1,所以从i-1位开始的后缀的排名的前一位的后缀至少也有该LCP长度的前缀是相同的

 

你可能感兴趣的:(ACM笔记-2串树)