Pagini recente » Cod sursa (job #2403849) | Cod sursa (job #1406843) | Cod sursa (job #1081806) | Cod sursa (job #2853075) | Cod sursa (job #886445)
Cod sursa(job #886445)
#include <fstream>
#include <algorithm>
#define NM 17000
#define LG 17
#define val1 first.first
#define val2 first.second
#define pos second
using namespace std;
ifstream f("substr.in");
ofstream g("substr.out");
typedef pair< pair<int, int>, int> PI;
PI Norm[NM];
int N, K, M;
int i, j;
int SortOrder[LG][NM];
char S[NM];
int length, step;
int ANS;
pair<int, int> SuffixArray[NM];
int LCP (int x, int y)
{
if (x==y) return N-x;
int ANS=0;
for (int step=M-1; step>=0 && x<=N && y<=N; --step)
if (SortOrder[step][x]==SortOrder[step][y])
{
x+=1 << step;
y+=1 << step;
ANS+=1 << step;
}
return ANS;
}
int main ()
{
f >> N >> K;
f >> (S+1);
for (i=1; i<=N; i++)
SortOrder[0][i]=S[i]-'a'+1;
for (step=1, length=1; length >> 1 <=N; ++step, length<<=1)
{
M=step;
for (i=1; i<=N; i++)
{
Norm[i].val1=SortOrder[step-1][i];
Norm[i].val2=(i+length<=N? SortOrder[step-1][i+length] : -1);
Norm[i].pos=i;
}
Norm[0].val1=-1;
sort(Norm+1, Norm+N+1);
for (i=1, j=0; i<=N; i++)
{
if (Norm[i].val1!=Norm[i-1].val1 || Norm[i].val2!=Norm[i-1].val2)
++j;
SortOrder[step][Norm[i].pos]=j;
}
}
for (i=1; i<=N; i++)
{
SuffixArray[i].first=SortOrder[M][i];
SuffixArray[i].second=i;
}
sort(SuffixArray+1, SuffixArray+N+1);
for (i=1; i<=N-K+1; i++)
ANS=max(ANS, LCP(SuffixArray[i].second, SuffixArray[i+K-1].second) );
g << min(ANS, N) << '\n';
f.close();
g.close();
return 0;
}