(新知)字符串--后缀数组--一个有个性的好模板

来源:互联网 发布:c语言主要知识 编辑:程序博客网 时间:2024/04/29 02:36

和其他的版本换汤不换药,以二元组的形式进行比较。时间复杂度为O(nlog2n)。

#include<bits/stdc++.h>using namespace std;#define len (int)str.size()const int maxn=int(1e6)+10;string str;int M=1;int s[maxn]; //序列数组int rnk[maxn],tmp[maxn]; //排名数组、备用排名数组bool cmp(int a,int b){    if(rnk[a]!=rnk[b]) return rnk[a]<rnk[b];    int x=a+M-1>len?-1:rnk[a+M-1];    int y=b+M-1>len?-1:rnk[b+M-1];    return x<y;}void print(string s,int pos){    for(int i=pos;i<=min((pos+M-1),int(s.size()));i++)        cout<<s[i];    cout<<endl;    return;}int main(){    freopen("input.txt","r",stdin);    freopen("output.txt","w",stdout);    getline(cin,str);    for(int i=0;i<=len;i++) s[i]=i, rnk[i]=i<len?str[i]:-1;    while(M<len)    {        M<<=1;        sort(s,s+len+1,cmp);        tmp[s[0]]=1;        for(int i=1;i<=len;i++)            if(!cmp(s[i-1],s[i])) tmp[s[i]]=tmp[s[i-1]];            else tmp[s[i]]=tmp[s[i-1]]+1;        for(int i=0;i<=len;i++) rnk[i]=tmp[i];    }    for(int i=0;i<=len;i++) print(str,s[i]);    cout<<"--------\n";    return 0;}
2 0
原创粉丝点击