Pagini recente » Cod sursa (job #444143) | Cod sursa (job #1335626) | Cod sursa (job #585225) | Cod sursa (job #2283966) | Cod sursa (job #426071)
Cod sursa(job #426071)
#include <stdio.h>
#include <algorithm>
#define IN "substr.in"
#define OUT "substr.out"
#define Lg 17000
#define U 19
using namespace std;
struct lol
{
int a,b,p;
}L[Lg];
struct cmp
{
bool operator()(const lol &i, const lol &j)const
{
return (i.a==j.a) ? (i.b<j.b) : (i.a<j.a);
}
};
int D[U][Lg];
int Poz[Lg];
int n, k, Max, stp, cnt, Rez;
char s[Lg];
void suffix()
{
for (int i=0;i<n;i++)
D[0][i]=s[i]-'a';
for (stp=1, cnt=1; (cnt>>1) <n; stp++, cnt<<=1)
{
for (int i=0;i<n;i++)
{
L[i].p=i;
L[i].a=D[stp-1][i];
L[i].b= i + stp <n ? D[stp-1][i+stp] :i;
}
sort(L,L+n,cmp());
for (int i=0;i<n;i++)
D[stp][L[i].p]= i>0 && L[i].a==L[i-1].a && L[i].b==L[i-1].b?D[stp][L[i-1].p]:i;
Max=stp;
}
for (int i=0;i<n;i++)
Poz[D[Max][i]]=i;
}
/*
int lcp(int p1,int p2)
{
int rez=0,i;
if (p1==p2)
return n-p1;
for (i=Max;i>=0 && p1<n && p2<n;i--)
{
if (D[i][p1] == D[i][p2])
{
p1+=1<<i;
p2+=1<<i;
rez+=1<<i;
}
}
return rez;
}
*/
int lcp(int x, int y)
{
if(x == y) return n-x;
int ret = 0, k;
for(k = Max; k>=0 && x< n && y < n; --k)
if(D[k][x] == D[k][y])
x+=1<<k, y+=1<<k, ret+=1<<k;
return ret;
}
void solve()
{
int aux;
for (int i=0;i+k-1<n;i++)
{
aux=lcp(Poz[i],Poz[i+k-1]);
if (aux>Rez)
Rez=aux;
}
printf("%d\n",Rez);
}
int main ()
{
freopen (IN ,"r",stdin);
freopen (OUT ,"w",stdout);
scanf ("%d %d\n",&n,&k);
fgets(s,Lg,stdin);
suffix();
solve();
return 0;
}