您的位置:首页 > 其它

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

2016-12-17 19:57 302 查看
和其他的版本换汤不换药,以二元组的形式进行比较。时间复杂度为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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  string