Pagini recente » Cod sursa (job #1063792) | Cod sursa (job #1471468) | Cod sursa (job #1163502) | Cod sursa (job #1207424) | Cod sursa (job #543689)
Cod sursa(job #543689)
#include<fstream>
#include<vector>
#include<algorithm>
#define MAXN 17000
using namespace std;
ifstream f1 ("substr.in");
ofstream f2 ("substr.out");
char A[MAXN];
struct entry
{
int nr[2], p;
} L[MAXN];
struct ab
{
int x, y;
} V[MAXN];
int P[20][MAXN], N,k, i, stp, cnt;
bool cmp(const entry &a, const entry &b)
{
if (a.nr[0]!=b.nr[0]) return a.nr[0]<b.nr[0];
else return a.nr[1]<b.nr[1];
}
int lcp (int a, int b)
{
int rez=0;
for (int i=stp-1; i>=0 && a<N&& b<N; --i)
if (P[i][a]==P[i][b])
a+=1<<i, b+=1<<i, rez+=1<<i;
return rez;
}
int cmp2 (ab a, ab b)
{
if (a.x!=b.x) return a.x<b.x;
else return a.y<b.y;
}
int main()
{
f1>>N>>k;
for (int i=0; i<N; i++) f1>>A[i];
for (int i=0; i<N; i++) P[0][i]=A[i]-'a';
for (stp = 1, cnt = 1; cnt >> 1 < N; ++stp, cnt <<= 1)
{
for (int i = 0; i < N; ++i)
{
L[i].nr[0] = P[stp - 1][i];
if (i+cnt<N) L[i].nr[1]= P[stp - 1][i + cnt];
else L[i].nr[1]= -1;
L[i].p = i;
}
sort(L, L + N, cmp);
for (int i = 0; i < N; ++i)
if (L[i].nr[0]==L[i - 1].nr[0]&&L[i].nr[1]==L[i - 1].nr[1])
P[stp][L[i].p]=P[stp][L[i - 1].p];
else P[stp][L[i].p]=i;
}
int val=0;
for (int i=0; i<N; i++) V[i].x=P[stp-1][i], V[i].y=i;
sort(V, V+N, cmp2);
for (int i=0; i<=N-k; i++)
val=max (val, lcp(V[i].y, V[i+k-1].y));
f2<<val<<"\n";
return 0;
}