Pagini recente » Cod sursa (job #394724) | Cod sursa (job #2955551) | Cod sursa (job #1165311) | Cod sursa (job #2449352) | Cod sursa (job #2653246)
#include <cstdio>
#include <algorithm>
#include <deque>
using namespace std;
int p[20][17000];
int n,kk;
struct Pereche
{
int cur,nxt;
};
struct Aux
{
Pereche pereche;
int pozitie;
} v[17000];
struct Sortare
{
int poz,ind;
} srt[17000];
int v2[17000];
struct Minim
{
int val,ind;
};
deque<Minim> dq;
char s[17000];
bool cmp(const Aux &a, const Aux &b)
{
if(a.pereche.cur==b.pereche.cur){
if(a.pereche.nxt==b.pereche.nxt)
return a.pozitie<b.pozitie;
return a.pereche.nxt<b.pereche.nxt;
}
return a.pereche.cur<b.pereche.cur;
}
bool cmp2(const Sortare &a, const Sortare &b)
{
return a.poz<b.poz;
}
int lcp(int i,int j)
{
int l,i1,j1;
if(i==j)
return n-i;
l=0;
for(int put=kk; put>=0 && i<n && j<n; put--)
if(p[put][i]==p[put][j]){
i+=(1<<put);
j+=(1<<put);
l+=(1<<put);
}
return l;
}
int main()
{ freopen("substr.in", "r", stdin);
freopen("substr.out", "w", stdout);
int k,i,pw,maxx;
scanf("%d%d\n", &n, &k);
if(k==1){
printf("%d", n);
return 0;
}
scanf("%s", s);
for(i=0; i<n; i++){
if(s[i]>='a' && s[i]<='z')
p[0][i]=s[i]-'a';
else{
if(s[i]>='A' && s[i]<='Z')
p[0][i]=s[i]-'A'+26;
else
p[0][i]=s[i]-'0'+52;
}
}
for(kk=1,pw=1; pw/2<n; pw*=2,kk++){
for(i=0; i<n; i++){
v[i].pereche={p[kk-1][i], i+pw<n?p[kk-1][i+pw]:-1};
v[i].pozitie=i;
}
sort(v, v+n, cmp);
for(i=0; i<n; i++){
if(i>0 && v[i].pereche.cur==v[i-1].pereche.cur && v[i].pereche.nxt==v[i-1].pereche.nxt)
p[kk][v[i].pozitie]=p[kk][v[i-1].pozitie];
else
p[kk][v[i].pozitie]=i;
}
}
kk--;
for(i=0; i<n; i++){
srt[i].poz=p[kk][i];
srt[i].ind=i;
}
sort(srt, srt+n, cmp2);
maxx=0;
for(i=0; i<=n-k; i++)
maxx=max(maxx, lcp(srt[i].ind, srt[i+k-1].ind));
printf("%d", maxx);
return 0;
}