#include<iostream>
#include<string.h>
#include<utility>
#include<algorithm>
using namespace std;
struct xx
{
string x;
short int d;
int lcp;
};
bool compare(const xx a,const xx b)
{
return a.x<b.x;
}
int findlcp(string a,string b)
{
int i=0,j=0,k=0;
while(i<a.length() && j<b.length())
{
if(a[i]==b[j])
{
k++;
i++;
j++;
}
else
{
break;
}
}
return k;
}
int main()
{
string a="banana";
xx b[100];
a=a+'$';
int len=a.length();
for(int i=0;i<len;i++)
{
b[i].x=a.substr(i);
b[i].d=i+1;
}
sort(b,b+len,compare);
for(int i=0;i<len;i++)
cout<<b[i].x<<" "<<b[i].d<<endl;
b[0].lcp=0;
b[1].lcp=0;
for(int i=2;i<len;i++)
{
b[i].lcp=findlcp(b[i].x,b[i-1].x);
}
for(int i=0;i<len;i++)
cout<<b[i].d<<" "<<b[i].lcp<<endl;
}
これは Suffix Arrayの実装です。ウィキペディアの記事の構成における私の質問は、最悪の場合 o(n) として与えられます
だから私の構築では:
- stl sort を使用して文字列のすべての接尾辞をソートしています。最悪の場合、これは少なくとも O(nlogn) になる可能性があります。したがって、ここでは O(n) 構造に違反しています。
- 2 つ目は、O(n) が与えられた最長共通プレフィックス配列の構築です。しかし、O(n^2) での実装だと思います。
したがって、最初のもの、つまりソート用
カウント ソートを使用すると、O(n) に減少する可能性があります。カウント ソートを使用すると、それは正しいですか?私の理解は正しいですか?私の理解が間違っている場合は教えてください
そして、O(n) 時間で LCP を見つける方法はありますか?