Pagini recente » Cod sursa (job #2135566) | Cod sursa (job #1384265) | Cod sursa (job #1330629) | Cod sursa (job #1182133) | Cod sursa (job #1254591)
#include <cstdio>
#include <algorithm>
using namespace std;
struct suffix
{
int s1,s2,poz;
bool operator <(const suffix &aux) const
{
if(s1==aux.s1) return s2<aux.s2;
else return s1<aux.s1;
}
bool operator ==(const suffix &aux) const
{
return s1==aux.s1 && s2==aux.s2;
}
}s[16400];
int p[16][16400],n,logn;
pair<int,int> v[16400];
char sir[16400];
int LCP(int x,int y)
{
if(x==y) return n-x;
int rez=0;
for(int i=logn;i>=0 && x<n && y<n;i--)
if(p[i][x]==p[i][y]) {rez+=1<<i;x+=1<<i;y+=1<<i;}
return rez;
}
int main()
{
freopen("substr.in", "r", stdin);
freopen("substr.out", "w", stdout);
int m;
scanf("%d%d\n%s",&n,&m,sir);
for(logn=1;1<<logn<n;logn++);
for(int i=0;i<n;i++) {p[0][i]=sir[i];s[i].poz=i;}
for(int i=1;i<=logn;i++)
{
for(int j=0;j<n;j++)
{
s[j].s1=p[i-1][s[j].poz];
if(s[j].poz+(1<<(i-1))<n) s[j].s2=p[i-1][s[j].poz+(1<<(i-1))];
else s[j].s2=-1;
}
sort(s,s+n);
for(int j=0;j<n;j++)
if(j>0 && s[j]==s[j-1]) p[i][s[j].poz]=p[i][s[j-1].poz];
else p[i][s[j].poz]=j;
}
int sol=0;
for(int i=0;i<=n-m;i++) sol=max(sol,LCP(s[i].poz,s[i+m-1].poz));
printf("%d",sol);
return 0;
}