Pagini recente » Cod sursa (job #489892) | Cod sursa (job #2886721) | Cod sursa (job #3175098) | Cod sursa (job #337780) | Cod sursa (job #1574218)
#include <fstream>
#include <cstring>
#include <algorithm>
#define MAXN 16385
#define MAXLG 18
using namespace std;
ifstream cin("substr.in");
ofstream cout("substr.out");
char A[MAXN];
int Max=-1,K;
struct entry {
int nr[2], p;
} L[MAXN];
int P[MAXLG][MAXN],N,i,step,Count;
bool cmp(const entry &a, const entry &b) {
if(a.nr[0]==b.nr[0])
return a.nr[1]<b.nr[1];
return a.nr[0]<b.nr[0];
}
int lcp(int x, int y) {
int k,ret=0;
if(x==y)
return N-x;
for(k=step-1;k >= 0 and x<N and y<N;k--)
if (P[k][x]==P[k][y])
{
x+=(1<<k);
y+=(1<<k);
ret+=(1<<k);
}
return ret;
}
int a=0;
int main()
{
cin>>N>>K;
cin>>A;
for(i=0;i<N;i++)
P[0][i]=A[i]-'a';
for(step=1,Count=1;Count >> 1 < N; ++step, Count <<= 1)
{
for(i=0;i<N;i++)
{
L[i].nr[0] = P[step - 1][i];
if(Count+i<N)
L[i].nr[1]=P[step - 1][i + Count];
else
L[i].nr[1]=-1;
L[i].p=i;
}
sort(L,L+N,cmp);
for(i=0;i<N;i++)
if(i>0 and L[i].nr[0]==L[i-1].nr[0] and L[i].nr[1]==L[i-1].nr[1])
P[step][L[i].p]=P[step][L[i-1].p];
else
P[step][L[i].p]=i;
}
for(i=0;i<N-K;i++)
Max=max(Max,lcp(L[i].p,L[i+K-1].p));
cout<<Max;
return 0;
}